@@ -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 {
827845mod 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