Skip to content

Commit

Permalink
fix(css/modules): Fix handling of :global() selector (#8219)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #8179
  • Loading branch information
kdy1 committed Nov 6, 2023
1 parent 6c59d53 commit 02cd7c2
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 22 deletions.
44 changes: 29 additions & 15 deletions crates/swc_css_modules/src/lib.rs
Expand Up @@ -476,7 +476,7 @@ where

'complex: for mut n in n.children.take() {
if let ComplexSelectorChildren::CompoundSelector(selector) = &mut n {
for (sel_index, sel) in selector.subclass_selectors.iter_mut().enumerate() {
for sel in selector.subclass_selectors.iter_mut() {
match sel {
SubclassSelector::Class(..) | SubclassSelector::Id(..) => {
if !self.data.is_global_mode {
Expand All @@ -489,7 +489,14 @@ where
);
}
}
SubclassSelector::PseudoClass(class_sel) => match &*class_sel.name.value {

_ => {}
}
}

for (sel_index, sel) in selector.subclass_selectors.iter_mut().enumerate() {
if let SubclassSelector::PseudoClass(class_sel) = sel {
match &*class_sel.name.value {
"local" => {
if let Some(children) = &mut class_sel.children {
if let Some(PseudoClassSelectorChildren::ComplexSelector(
Expand All @@ -508,7 +515,8 @@ where
complex_selector.children.clone();
prepend_left_subclass_selectors(
&mut complex_selector_children,
selector.subclass_selectors.split_at(sel_index),
&mut selector.subclass_selectors,
sel_index,
);
new_children.extend(complex_selector_children);

Expand Down Expand Up @@ -537,7 +545,8 @@ where
complex_selector.children.clone();
prepend_left_subclass_selectors(
&mut complex_selector_children,
selector.subclass_selectors.split_at(sel_index),
&mut selector.subclass_selectors,
sel_index,
);
new_children.extend(complex_selector_children);
}
Expand All @@ -554,8 +563,7 @@ where
continue 'complex;
}
_ => {}
},
_ => {}
}
}
}
}
Expand Down Expand Up @@ -661,16 +669,22 @@ fn process_local<C>(

fn prepend_left_subclass_selectors(
complex_selector_children: &mut [ComplexSelectorChildren],
sels: (&[SubclassSelector], &[SubclassSelector]),
sels: &mut Vec<SubclassSelector>,
mut sel_index: usize,
) {
if let Some(ComplexSelectorChildren::CompoundSelector(first)) =
complex_selector_children.get_mut(0)
sels.remove(sel_index);

for c in complex_selector_children
.iter_mut()
.filter_map(|c| c.as_mut_compound_selector())
{
first.subclass_selectors = [
sels.0.to_vec(),
first.subclass_selectors.take(),
sels.1[1..].to_vec(),
]
.concat();
c.subclass_selectors.splice(0..0, sels.drain(..sel_index));

if sels.len() > sel_index {
c.subclass_selectors
.extend(sels[..sel_index + 1].iter().cloned());
}

sel_index = 0;
}
}
3 changes: 3 additions & 0 deletions crates/swc_css_modules/tests/fixture/issue-8179.compiled.css
@@ -0,0 +1,3 @@
.__local__a.b .c.__local__d {
color: red;
}
3 changes: 3 additions & 0 deletions crates/swc_css_modules/tests/fixture/issue-8179.css
@@ -0,0 +1,3 @@
.a:global(.b .c).d {
color: red;
}
14 changes: 14 additions & 0 deletions crates/swc_css_modules/tests/fixture/issue-8179.transform.json
@@ -0,0 +1,14 @@
{
"a": [
{
"type": "local",
"name": "__local__a"
}
],
"d": [
{
"type": "local",
"name": "__local__d"
}
]
}
@@ -1,6 +1,6 @@
.a:hover {
color: blue;
}
.__local__a.b {
.__local__a.__local__b {
color: red;
}
@@ -1,8 +1,14 @@
{
"a": [
{
"type": "local",
"name": "__local__a"
}
]
"b": [
{
"type": "local",
"name": "__local__b"
}
],
"a": [
{
"type": "local",
"name": "__local__a"
}
]
}

0 comments on commit 02cd7c2

Please sign in to comment.