diff --git a/lib/util/get-allow-modules.js b/lib/util/get-allow-modules.js index 428a3910..5def81f3 100644 --- a/lib/util/get-allow-modules.js +++ b/lib/util/get-allow-modules.js @@ -53,7 +53,7 @@ module.exports.schema = { type: "array", items: { type: "string", - pattern: "^(?:@[a-zA-Z0-9_\\-.]+/)?[a-zA-Z0-9_\\-.]+$", + pattern: "^(?:virtual:)?(?:@[a-zA-Z0-9_\\-.]+/)?[a-zA-Z0-9_\\-.]+$", }, uniqueItems: true, } diff --git a/tests/lib/rules/no-extraneous-import.js b/tests/lib/rules/no-extraneous-import.js index 54ac2303..49b1e3a0 100644 --- a/tests/lib/rules/no-extraneous-import.js +++ b/tests/lib/rules/no-extraneous-import.js @@ -98,6 +98,16 @@ ruleTester.run("no-extraneous-import", rule, { filename: fixture("tsconfig-paths/index.ts"), code: "import foo from '#configurations/foo'", }, + + // virtual modules + { + filename: fixture("test.js"), + code: "import a from 'virtual:package-name';", + }, + { + filename: fixture("test.js"), + code: "import a from 'virtual:package-scope/name';", + }, ], invalid: [ { diff --git a/tests/lib/rules/no-extraneous-require.js b/tests/lib/rules/no-extraneous-require.js index 5706492b..9310b837 100644 --- a/tests/lib/rules/no-extraneous-require.js +++ b/tests/lib/rules/no-extraneous-require.js @@ -67,6 +67,16 @@ tester.run("no-extraneous-require", rule, { filename: fixture("dependencies/a.js"), code: "require('ccc')", }, + + // virtual modules + { + filename: fixture("test.js"), + code: "require('virtual:package-name');", + }, + { + filename: fixture("test.js"), + code: "require('virtual:package-scope/name');", + }, ], invalid: [ { diff --git a/tests/lib/rules/no-missing-import.js b/tests/lib/rules/no-missing-import.js index 8f719be5..478e181f 100644 --- a/tests/lib/rules/no-missing-import.js +++ b/tests/lib/rules/no-missing-import.js @@ -167,6 +167,17 @@ ruleTester.run("no-missing-import", rule, { code: "import electron from 'electron';", options: [{ allowModules: ["electron"] }], }, + // allow virtual modules + { + filename: fixture("test.js"), + code: "import a from 'virtual:package-name';", + options: [{ allowModules: ["virtual:package-name"] }], + }, + { + filename: fixture("test.js"), + code: "import a from 'virtual:package-scope/name';", + options: [{ allowModules: ["virtual:package-scope"] }], + }, // resolvePaths { @@ -480,5 +491,17 @@ ruleTester.run("no-missing-import", rule, { }, ] : []), + + // virtual modules + { + filename: fixture("test.js"), + code: "import a from 'virtual:package-name';", + errors: cantResolve("virtual:package-name"), + }, + { + filename: fixture("test.js"), + code: "import a from 'virtual:package-scope/name';", + errors: cantResolve("virtual:package-scope/name"), + }, ], }) diff --git a/tests/lib/rules/no-missing-require.js b/tests/lib/rules/no-missing-require.js index 98028e05..f640e719 100644 --- a/tests/lib/rules/no-missing-require.js +++ b/tests/lib/rules/no-missing-require.js @@ -240,6 +240,17 @@ ruleTester.run("no-missing-require", rule, { code: "require('jquery.cookie');", options: [{ allowModules: ["jquery.cookie"] }], }, + // allow virtual modules + { + filename: fixture("test.js"), + code: "require('virtual:package-name');", + options: [{ allowModules: ["virtual:package-name"] }], + }, + { + filename: fixture("test.js"), + code: "require('virtual:package-scope/name');", + options: [{ allowModules: ["virtual:package-scope"] }], + }, // typescriptExtensionMap { @@ -440,6 +451,18 @@ ruleTester.run("no-missing-require", rule, { code: "require.resolve('no-exist-package-0');", errors: cantResolve("no-exist-package-0"), }, + + // Virtual modules + { + filename: fixture("test.js"), + code: "require('virtual:package-name');", + errors: cantResolve("virtual:package-name"), + }, + { + filename: fixture("test.js"), + code: "require('virtual:package-scope/name');", + errors: cantResolve("virtual:package-scope/name"), + }, ], }) diff --git a/tests/lib/rules/no-unpublished-import.js b/tests/lib/rules/no-unpublished-import.js index 6c4adfd0..d5e31b20 100644 --- a/tests/lib/rules/no-unpublished-import.js +++ b/tests/lib/rules/no-unpublished-import.js @@ -123,11 +123,23 @@ ruleTester.run("no-unpublished-import", rule, { code: "import a from './a';", }, + // allow module { filename: fixture("1/test.js"), code: "import electron from 'electron';", options: [{ allowModules: ["electron"] }], }, + // allow virtual modules + { + filename: fixture("test.js"), + code: "import a from 'virtual:package-name';", + options: [{ allowModules: ["virtual:package-name"] }], + }, + { + filename: fixture("test.js"), + code: "import a from 'virtual:package-scope/name';", + options: [{ allowModules: ["virtual:package-scope"] }], + }, // Auto-published files only apply to root package directory { diff --git a/tests/lib/rules/no-unpublished-require.js b/tests/lib/rules/no-unpublished-require.js index 664723ea..f9a4b002 100644 --- a/tests/lib/rules/no-unpublished-require.js +++ b/tests/lib/rules/no-unpublished-require.js @@ -224,6 +224,17 @@ ruleTester.run("no-unpublished-require", rule, { code: "require('electron');", options: [{ allowModules: ["electron"] }], }, + // allow virtual modules + { + filename: fixture("test.js"), + code: "require('virtual:package-name');", + options: [{ allowModules: ["virtual:package-name"] }], + }, + { + filename: fixture("test.js"), + code: "require('virtual:package-scope/name');", + options: [{ allowModules: ["virtual:package-scope"] }], + }, // Auto-published files only apply to root package directory {