From fcdb91d46d4e9228725ece77ce128a84c08625a3 Mon Sep 17 00:00:00 2001 From: shulaoda <165626830+shulaoda@users.noreply.github.com> Date: Thu, 7 Aug 2025 15:18:48 +0000 Subject: [PATCH] refactor(linter/no-restricted-imports): use `fast-glob` instead of `globset` (#12868) Related to #12825 --- .../src/rules/eslint/no_restricted_imports.rs | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) 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 da0d9226a0b71..5345f199565db 100644 --- a/crates/oxc_linter/src/rules/eslint/no_restricted_imports.rs +++ b/crates/oxc_linter/src/rules/eslint/no_restricted_imports.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; -use globset::GlobBuilder; +use cow_utils::CowUtils as _; use lazy_regex::Regex; use oxc_ast::{ AstKind, @@ -869,22 +869,20 @@ impl RestrictedPattern { None => (false, raw_pat.as_str()), }; - // roughly based on https://github.com/BurntSushi/ripgrep/blob/6dfaec03e830892e787686917509c17860456db1/crates/ignore/src/gitignore.rs#L436-L516 - let mut pat = pat.to_string(); - - if !pat.starts_with('/') && !pat.chars().any(|c| c == '/') && (!pat.starts_with("**")) { - pat = format!("**/{pat}"); - } + // roughly based on https://github.com/BurntSushi/ripgrep/blob/6dfaec03/crates/ignore/src/gitignore.rs#L436-L516 + let pat = if pat.contains('/') { + Cow::Borrowed(pat) + } else { + Cow::Owned(format!("**/{pat}")) + }; - let Ok(glob) = GlobBuilder::new(&pat) - .case_insensitive(case_insensitive) - .build() - .map(|g| g.compile_matcher()) - else { - continue; + let (pat, name) = if case_insensitive { + (pat.cow_to_ascii_lowercase(), name.cow_to_ascii_lowercase()) + } else { + (pat, name.into()) }; - if glob.is_match(name) { + if fast_glob::glob_match(pat.as_ref(), name.as_ref()) { decision = if negated { GlobResult::Whitelist } else { GlobResult::Found }; } }