Skip to content

Commit f85ea9c

Browse files
authoredFeb 8, 2023
fix(css/modules): Fix interop of & and :global (#6900)
1 parent c293c14 commit f85ea9c

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed
 

‎crates/swc_css_modules/src/lib.rs

+34-3
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ where
374374

375375
'complex: for mut n in n.children.take() {
376376
if let ComplexSelectorChildren::CompoundSelector(selector) = &mut n {
377-
for sel in &mut selector.subclass_selectors {
377+
for (sel_index, sel) in selector.subclass_selectors.iter_mut().enumerate() {
378378
match sel {
379379
SubclassSelector::Class(..) | SubclassSelector::Id(..) => {
380380
if !self.data.is_global_mode {
@@ -402,7 +402,17 @@ where
402402

403403
complex_selector.visit_mut_with(self);
404404

405-
new_children.extend(complex_selector.children.clone());
405+
let mut complex_selector_children =
406+
complex_selector.children.clone();
407+
prepend_left_subclass_selectors(
408+
&mut complex_selector_children,
409+
selector
410+
.subclass_selectors
411+
.split_at(sel_index)
412+
.0
413+
.to_vec(),
414+
);
415+
new_children.extend(complex_selector_children);
406416

407417
self.data.is_global_mode = old_is_global_mode;
408418
self.data.is_in_local_pseudo_class = old_inside;
@@ -419,7 +429,17 @@ where
419429
complex_selector,
420430
)) = children.get_mut(0)
421431
{
422-
new_children.extend(complex_selector.children.clone());
432+
let mut complex_selector_children =
433+
complex_selector.children.clone();
434+
prepend_left_subclass_selectors(
435+
&mut complex_selector_children,
436+
selector
437+
.subclass_selectors
438+
.split_at(sel_index)
439+
.0
440+
.to_vec(),
441+
);
442+
new_children.extend(complex_selector_children);
423443
}
424444
} else {
425445
self.data.is_global_mode = true;
@@ -523,3 +543,14 @@ fn process_local<C>(
523543
SubclassSelector::PseudoElement(_) => {}
524544
}
525545
}
546+
547+
fn prepend_left_subclass_selectors(
548+
complex_selector_children: &mut [ComplexSelectorChildren],
549+
left_sels: Vec<SubclassSelector>,
550+
) {
551+
if let Some(ComplexSelectorChildren::CompoundSelector(first)) =
552+
complex_selector_children.get_mut(0)
553+
{
554+
first.subclass_selectors = [left_sels, first.subclass_selectors.take()].concat();
555+
}
556+
}

‎crates/swc_css_modules/tests/fixture/integration/css.module.compiled.css

+6
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,9 @@
55
.global {
66
color: blue;
77
}
8+
.__local__local.global {
9+
color: green;
10+
}
11+
.__local__local.__local__local {
12+
color: yellow;
13+
}

‎crates/swc_css_modules/tests/fixture/integration/css.module.css

+8
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,11 @@
66
:global(.global) {
77
color: blue;
88
}
9+
10+
.local:global(.global) {
11+
color: green;
12+
}
13+
14+
.local:local(.local) {
15+
color: yellow;
16+
}

‎crates/swc_css_modules/tests/fixture/modules/issue-995/issue-995.compiled.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ div:not(.__local__a) {
5252
.__local__😓 .__local__a {
5353
color: red;
5454
}
55-
.__local__a {
55+
.__local__😓.__local__a {
5656
color: red;
5757
}
5858
.__local__a > .__local__b > .__local__c {

0 commit comments

Comments
 (0)
Please sign in to comment.