Skip to content

Commit d7e1ddb

Browse files
committed
fix(linter/config): ensure that overrides correctly replace base rules (#12941)
fixes #12891
1 parent d7cca12 commit d7e1ddb

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

crates/oxc_linter/src/config/config_store.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ impl Config {
220220
if *severity == AllowWarnDeny::Allow {
221221
rules.remove(rule);
222222
} else {
223+
let _ = rules.remove(rule);
223224
rules.insert(rule.clone(), *severity);
224225
}
225226
}
@@ -342,7 +343,10 @@ impl ConfigStore {
342343

343344
#[cfg(test)]
344345
mod test {
346+
use std::str::FromStr;
347+
345348
use rustc_hash::{FxHashMap, FxHashSet};
349+
use serde_json::Value;
346350

347351
use super::{ConfigStore, ResolvedOxlintOverrides};
348352
use crate::{
@@ -354,6 +358,7 @@ mod test {
354358
config_store::{Config, ResolvedOxlintOverride, ResolvedOxlintOverrideRules},
355359
overrides::GlobSet,
356360
},
361+
rule::Rule,
357362
rules::{EslintNoUnusedVars, ReactJsxFilenameExtension, TypescriptNoExplicitAny},
358363
};
359364

@@ -872,6 +877,68 @@ mod test {
872877
assert!(has_react_rules, "React rules should be enabled by categories for new plugin");
873878
}
874879

880+
#[test]
881+
fn test_rule_config_override_replaces_properly() {
882+
let base_rules = vec![(
883+
RuleEnum::EslintNoUnusedVars(EslintNoUnusedVars::default()),
884+
AllowWarnDeny::Deny,
885+
)];
886+
let override_rule =
887+
EslintNoUnusedVars::from_configuration(Value::from_str(r#"["local"]"#).unwrap());
888+
let overrides = ResolvedOxlintOverrides::new(vec![ResolvedOxlintOverride {
889+
env: None,
890+
files: GlobSet::new(vec!["*.tsx"]),
891+
plugins: None,
892+
globals: None,
893+
rules: ResolvedOxlintOverrideRules {
894+
builtin_rules: vec![(
895+
RuleEnum::EslintNoUnusedVars(override_rule),
896+
AllowWarnDeny::Deny,
897+
)],
898+
external_rules: vec![],
899+
},
900+
}]);
901+
902+
let store = ConfigStore::new(
903+
Config::new(
904+
base_rules.clone(),
905+
vec![],
906+
OxlintCategories::default(),
907+
LintConfig::default(),
908+
overrides,
909+
),
910+
FxHashMap::default(),
911+
ExternalPluginStore::default(),
912+
);
913+
914+
assert!(
915+
format!("{:?}", base_rules[0].0)
916+
== format!(
917+
"{:?}",
918+
store
919+
.resolve("app.ts".as_ref())
920+
.rules
921+
.iter()
922+
.find(|(rule, _)| matches!(rule, RuleEnum::EslintNoUnusedVars(_)))
923+
.unwrap()
924+
.0
925+
)
926+
);
927+
assert!(
928+
format!("{:?}", base_rules[0].0)
929+
!= format!(
930+
"{:?}",
931+
store
932+
.resolve("app.tsx".as_ref())
933+
.rules
934+
.iter()
935+
.find(|(rule, _)| matches!(rule, RuleEnum::EslintNoUnusedVars(_)))
936+
.unwrap()
937+
.0
938+
)
939+
);
940+
}
941+
875942
#[test]
876943
fn test_categories_not_reapplied_to_root_plugins() {
877944
// Test that categories are NOT re-applied to plugins that were already in root

0 commit comments

Comments
 (0)