Skip to content

Commit b1b3ac0

Browse files
committed
refactor(linter): resolve globals from env on build
1 parent 67983f3 commit b1b3ac0

File tree

8 files changed

+184
-159
lines changed

8 files changed

+184
-159
lines changed

crates/oxc_linter/src/config/config_builder.rs

Lines changed: 137 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
AllowWarnDeny, ExternalPluginStore, LintConfig, LintFilter, LintFilterKind, Oxlintrc,
1515
RuleCategory, RuleEnum,
1616
config::{
17-
ESLintRule, OxlintOverrides, OxlintRules,
17+
ESLintRule, OxlintGlobals, OxlintOverrides, OxlintRules,
1818
external_plugins::ExternalPluginEntry,
1919
overrides::OxlintOverride,
2020
plugins::{LintPlugins, is_normal_plugin_name, normalize_plugin_name},
@@ -257,11 +257,14 @@ impl ConfigStoreBuilder {
257257
categories.insert(RuleCategory::Correctness, AllowWarnDeny::Warn);
258258
}
259259

260+
let mut globals = OxlintGlobals::default();
261+
oxlintrc.env.override_globals(&mut globals);
262+
oxlintrc.globals.override_globals(&mut globals);
263+
260264
let config = LintConfig {
261265
plugins,
262266
settings: oxlintrc.settings,
263-
env: oxlintrc.env,
264-
globals: oxlintrc.globals,
267+
globals,
265268
path: Some(oxlintrc.path),
266269
options: oxlintrc.options,
267270
};
@@ -526,6 +529,22 @@ impl ConfigStoreBuilder {
526529
external_plugin_store,
527530
)?;
528531

532+
let globals = if override_config.env.is_some() || override_config.globals.is_some()
533+
{
534+
let mut globals = OxlintGlobals::default();
535+
if let Some(override_env) = override_config.env {
536+
override_env.override_globals(&mut globals);
537+
}
538+
539+
if let Some(override_globals) = override_config.globals {
540+
override_globals.override_globals(&mut globals);
541+
}
542+
543+
Some(globals)
544+
} else {
545+
None
546+
};
547+
529548
// Convert to vectors
530549
builtin_rules.extend(rules_map.into_iter());
531550
external_rules.extend(
@@ -536,8 +555,7 @@ impl ConfigStoreBuilder {
536555

537556
Ok::<_, Vec<OverrideRulesError>>(ResolvedOxlintOverride {
538557
files: override_config.files,
539-
env: override_config.env,
540-
globals: override_config.globals,
558+
globals,
541559
plugins: override_config.plugins,
542560
rules: ResolvedOxlintOverrideRules { builtin_rules, external_rules },
543561
})
@@ -827,6 +845,8 @@ impl From<Vec<OverrideRulesError>> for ConfigBuilderError {
827845
mod test {
828846
use std::path::PathBuf;
829847

848+
use crate::config::GlobalValue;
849+
830850
use super::*;
831851

832852
#[test]
@@ -1132,6 +1152,118 @@ mod test {
11321152
}
11331153
}
11341154

1155+
#[test]
1156+
fn test_overrides_globals() {
1157+
let base_config = config_store_from_str(
1158+
r#"
1159+
{
1160+
"globals": {
1161+
"window": "readonly"
1162+
},
1163+
"overrides": [
1164+
{
1165+
"files": ["*.ts"],
1166+
"globals": {
1167+
"window": "off"
1168+
}
1169+
}
1170+
]
1171+
}
1172+
"#,
1173+
);
1174+
1175+
assert_eq!(base_config.base.config.globals.get("window").unwrap(), &GlobalValue::Readonly);
1176+
assert!(!base_config.overrides.is_empty());
1177+
1178+
let globals = base_config.overrides.iter().next().unwrap().globals.as_ref();
1179+
assert!(globals.is_some());
1180+
assert_eq!(globals.unwrap().get("window").unwrap(), &GlobalValue::Off);
1181+
}
1182+
1183+
#[test]
1184+
fn test_overrides_globals_by_env() {
1185+
let base_config = config_store_from_str(
1186+
r#"
1187+
{
1188+
"globals": {
1189+
"window": "off"
1190+
},
1191+
"overrides": [
1192+
{
1193+
"files": ["*.ts"],
1194+
"env": {
1195+
"browser": true
1196+
}
1197+
}
1198+
]
1199+
}
1200+
"#,
1201+
);
1202+
1203+
assert_eq!(base_config.base.config.globals.get("window").unwrap(), &GlobalValue::Off);
1204+
assert!(!base_config.overrides.is_empty());
1205+
1206+
let globals = base_config.overrides.iter().next().unwrap().globals.as_ref();
1207+
assert!(globals.is_some());
1208+
assert_eq!(globals.unwrap().get("window").unwrap(), &GlobalValue::Readonly);
1209+
}
1210+
1211+
#[test]
1212+
fn test_overrides_env() {
1213+
let base_config = config_store_from_str(
1214+
r#"
1215+
{
1216+
"env": {
1217+
"browser": true
1218+
},
1219+
"overrides": [
1220+
{
1221+
"files": ["*.ts"],
1222+
"env": {
1223+
"browser": false
1224+
}
1225+
}
1226+
]
1227+
}
1228+
"#,
1229+
);
1230+
1231+
assert_eq!(base_config.base.config.globals.get("window").unwrap(), &GlobalValue::Readonly);
1232+
assert!(!base_config.overrides.is_empty());
1233+
1234+
let globals = base_config.overrides.iter().next().unwrap().globals.as_ref();
1235+
assert!(globals.is_some());
1236+
assert_eq!(globals.unwrap().get("window").unwrap(), &GlobalValue::Off);
1237+
}
1238+
1239+
#[test]
1240+
fn test_overrides_env_by_global() {
1241+
let base_config = config_store_from_str(
1242+
r#"
1243+
{
1244+
"env": {
1245+
"browser": true
1246+
},
1247+
"overrides": [
1248+
{
1249+
"files": ["*.ts"],
1250+
"globals": {
1251+
"window": "off"
1252+
}
1253+
}
1254+
]
1255+
}
1256+
"#,
1257+
);
1258+
1259+
assert_eq!(base_config.base.config.globals.get("window").unwrap(), &GlobalValue::Readonly);
1260+
assert!(!base_config.overrides.is_empty());
1261+
1262+
let globals = base_config.overrides.iter().next().unwrap().globals.as_ref();
1263+
assert!(globals.is_some());
1264+
assert_eq!(globals.unwrap().get("window").unwrap(), &GlobalValue::Off);
1265+
}
1266+
11351267
#[test]
11361268
fn test_extends_rules_single() {
11371269
let base_config = config_store_from_path("fixtures/extends_config/rules_config.json");

0 commit comments

Comments
 (0)