From 1dd0d2172de3b88506238bcaff869b1362052f7e Mon Sep 17 00:00:00 2001 From: camc314 <18101008+camc314@users.noreply.github.com> Date: Thu, 5 Mar 2026 13:02:33 +0000 Subject: [PATCH] fix(linter/no-restricted-imports): apply regex pattern checks to side-effect imports (#20028) fixes #19956 --- .../src/rules/eslint/no_restricted_imports.rs | 29 +++++++++++++++++++ .../eslint_no_restricted_imports.snap | 7 +++++ 2 files changed, 36 insertions(+) diff --git a/crates/oxc_linter/src/rules/eslint/no_restricted_imports.rs b/crates/oxc_linter/src/rules/eslint/no_restricted_imports.rs index 28f89abaad682..5a1832b5627f1 100644 --- a/crates/oxc_linter/src/rules/eslint/no_restricted_imports.rs +++ b/crates/oxc_linter/src/rules/eslint/no_restricted_imports.rs @@ -857,6 +857,11 @@ impl RestrictedPattern { } } + fn is_side_effect_import_allowed(&self) -> bool { + let unused_name = CompactStr::from("__<>import_name_that_cant_be_used<>__"); + self.is_name_span_allowed(&unused_name) == NameSpanAllowedResult::Allowed + } + fn get_group_glob_result(&self, name: &str) -> GlobResult { let Some(groups) = &self.group else { return GlobResult::None; @@ -1041,6 +1046,15 @@ impl NoRestrictedImports { } GlobResult::None => {} } + + if pattern.get_regex_result(source) && !pattern.is_side_effect_import_allowed() { + ctx.diagnostic(get_diagnostic_from_import_name_result_pattern( + spans[0], + source, + &ImportNameResult::GeneralDisallowed, + pattern, + )); + } } if !whitelist_found && let Some(err) = err { ctx.diagnostic(err); @@ -1808,6 +1822,15 @@ fn test() { }] }])), ), + ( + "import 'foo';", + Some(serde_json::json!([{ + "patterns": [{ + "regex": "foo", + "importNames": ["Bar"], + }] + }])), + ), ( r#"import a from "./index.mjs";"#, Some( @@ -3073,6 +3096,12 @@ fn test() { serde_json::json!([{ "patterns": [{ "group": ["foo"], "message": "foo is forbidden, use bar instead" }] }]), ), ), + ( + r"import 'foo'", + Some( + serde_json::json!([{ "patterns": [{ "regex": "foo", "message": "foo is forbidden, use bar instead" }] }]), + ), + ), ]; let fail_typescript = vec![ diff --git a/crates/oxc_linter/src/snapshots/eslint_no_restricted_imports.snap b/crates/oxc_linter/src/snapshots/eslint_no_restricted_imports.snap index 1c6858839844a..9ca79e44b6b6f 100644 --- a/crates/oxc_linter/src/snapshots/eslint_no_restricted_imports.snap +++ b/crates/oxc_linter/src/snapshots/eslint_no_restricted_imports.snap @@ -823,6 +823,13 @@ source: crates/oxc_linter/src/tester.rs ╰──── help: foo is forbidden, use bar instead + ⚠ eslint(no-restricted-imports): 'foo' import is restricted from being used by a pattern. + ╭─[no_restricted_imports.tsx:1:1] + 1 │ import 'foo' + · ──────────── + ╰──── + help: foo is forbidden, use bar instead + ⚠ eslint(no-restricted-imports): 'import1' import is restricted from being used. ╭─[no_restricted_imports.tsx:1:1] 1 │ import foo from 'import1';