diff --git a/crates/turbopack-core/src/reference_type.rs b/crates/turbopack-core/src/reference_type.rs index 4db243e549514b..4b1fa832831a66 100644 --- a/crates/turbopack-core/src/reference_type.rs +++ b/crates/turbopack-core/src/reference_type.rs @@ -157,4 +157,14 @@ impl ReferenceType { ReferenceType::Undefined => true, } } + + /// Returns true if this reference type is internal. This will be used in + /// combination with [`ModuleRuleCondition::Internal`] to determine if a + /// rule should be applied to an internal asset/reference. + pub fn is_internal(&self) -> bool { + matches!( + self, + ReferenceType::Internal(_) | ReferenceType::Css(CssReferenceSubType::Internal) + ) + } } diff --git a/crates/turbopack/src/module_options/mod.rs b/crates/turbopack/src/module_options/mod.rs index b3811b7208ec68..9f97595c56c168 100644 --- a/crates/turbopack/src/module_options/mod.rs +++ b/crates/turbopack/src/module_options/mod.rs @@ -225,12 +225,9 @@ impl ModuleOptionsVc { vec![ModuleRuleEffect::ModuleType(ModuleType::Json)], ), ModuleRule::new( - ModuleRuleCondition::all(vec![ - ModuleRuleCondition::ResourcePathEndsWith(".css".to_string()), - ModuleRuleCondition::not(ModuleRuleCondition::ReferenceType( - ReferenceType::Css(CssReferenceSubType::Internal), - )), - ]), + ModuleRuleCondition::all(vec![ModuleRuleCondition::ResourcePathEndsWith( + ".css".to_string(), + )]), [ if let Some(options) = enable_postcss_transform { let execution_context = execution_context @@ -263,33 +260,24 @@ impl ModuleOptionsVc { .collect(), ), ModuleRule::new( - ModuleRuleCondition::all(vec![ - ModuleRuleCondition::ResourcePathEndsWith(".module.css".to_string()), - ModuleRuleCondition::not(ModuleRuleCondition::ReferenceType( - ReferenceType::Css(CssReferenceSubType::Internal), - )), - ]), + ModuleRuleCondition::all(vec![ModuleRuleCondition::ResourcePathEndsWith( + ".module.css".to_string(), + )]), vec![ModuleRuleEffect::ModuleType(ModuleType::CssModule)], ), - ModuleRule::new( - ModuleRuleCondition::all(vec![ - ModuleRuleCondition::ResourcePathEndsWith(".css".to_string()), - ModuleRuleCondition::ReferenceType(ReferenceType::Css( - CssReferenceSubType::Internal, - )), - ]), + ModuleRule::new_internal( + ModuleRuleCondition::all(vec![ModuleRuleCondition::ResourcePathEndsWith( + ".css".to_string(), + )]), vec![ModuleRuleEffect::ModuleType(ModuleType::Css { ty: CssModuleAssetType::Default, transforms: css_transforms, })], ), - ModuleRule::new( - ModuleRuleCondition::all(vec![ - ModuleRuleCondition::ResourcePathEndsWith(".module.css".to_string()), - ModuleRuleCondition::ReferenceType(ReferenceType::Css( - CssReferenceSubType::Internal, - )), - ]), + ModuleRule::new_internal( + ModuleRuleCondition::all(vec![ModuleRuleCondition::ResourcePathEndsWith( + ".module.css".to_string(), + )]), vec![ModuleRuleEffect::ModuleType(ModuleType::Css { ty: CssModuleAssetType::Module, transforms: css_transforms, diff --git a/crates/turbopack/src/module_options/module_rule.rs b/crates/turbopack/src/module_options/module_rule.rs index 2b97d8ff0e9dcf..6a170ab1436de8 100644 --- a/crates/turbopack/src/module_options/module_rule.rs +++ b/crates/turbopack/src/module_options/module_rule.rs @@ -15,11 +15,44 @@ use super::{CustomModuleTypeVc, ModuleRuleCondition}; pub struct ModuleRule { condition: ModuleRuleCondition, effects: Vec, + match_mode: MatchMode, +} + +#[derive(Default, Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs)] +enum MatchMode { + // Match all but internal references. + #[default] + Default, + // Only match internal references. + Internal, +} + +impl MatchMode { + fn matches(&self, reference_type: &ReferenceType) -> bool { + matches!( + (self, reference_type.is_internal()), + (MatchMode::Default, false) | (MatchMode::Internal, true) + ) + } } impl ModuleRule { + /// Creates a new module rule. Will not match internal references. pub fn new(condition: ModuleRuleCondition, effects: Vec) -> Self { - ModuleRule { condition, effects } + ModuleRule { + condition, + effects, + match_mode: Default::default(), + } + } + + /// Creates a new module rule. Will only matches internal references. + pub fn new_internal(condition: ModuleRuleCondition, effects: Vec) -> Self { + ModuleRule { + condition, + effects, + match_mode: MatchMode::Internal, + } } pub fn effects(&self) -> impl Iterator { @@ -32,7 +65,8 @@ impl ModuleRule { path: &FileSystemPath, reference_type: &ReferenceType, ) -> Result { - self.condition.matches(source, path, reference_type).await + Ok(self.match_mode.matches(reference_type) + && self.condition.matches(source, path, reference_type).await?) } }