Skip to content

Commit 6c1e462

Browse files
authored
fix: mark nesting selectors of global parents as used (#13445)
fixes #13387
1 parent c716329 commit 6c1e462

File tree

4 files changed

+53
-8
lines changed

4 files changed

+53
-8
lines changed

packages/svelte/src/compiler/phases/2-analyze/css/css-analyze.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,19 @@ const css_visitors = {
114114
node.metadata.used ||= node.children.every(
115115
({ metadata }) => metadata.is_global || metadata.is_global_like
116116
);
117+
118+
if (
119+
node.metadata.rule?.metadata.parent_rule &&
120+
node.children[0]?.selectors[0]?.type === 'NestingSelector'
121+
) {
122+
const parent_is_global = node.metadata.rule.metadata.parent_rule.prelude.children.some(
123+
(child) => child.children.length === 1 && child.children[0].metadata.is_global
124+
);
125+
// mark `&:hover` in `:global(.foo) { &:hover { color: green }}` as used
126+
if (parent_is_global) {
127+
node.metadata.used = true;
128+
}
129+
}
117130
},
118131
RelativeSelector(node, context) {
119132
node.metadata.is_global = node.selectors.length >= 1 && is_global(node);

packages/svelte/tests/css/samples/global-nested-block/_config.js

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,46 @@ import { test } from '../../test';
22

33
export default test({
44
warnings: [
5+
{
6+
code: 'css_unused_selector',
7+
message: 'Unused CSS selector ".unused"',
8+
start: {
9+
line: 19,
10+
column: 3,
11+
character: 204
12+
},
13+
end: {
14+
line: 19,
15+
column: 10,
16+
character: 211
17+
}
18+
},
519
{
620
code: 'css_unused_selector',
721
message: 'Unused CSS selector ".unused :global"',
822
start: {
9-
line: 25,
23+
line: 34,
1024
column: 2,
11-
character: 229
25+
character: 332
1226
},
1327
end: {
14-
line: 25,
28+
line: 34,
1529
column: 17,
16-
character: 244
30+
character: 347
1731
}
1832
},
1933
{
2034
code: 'css_unused_selector',
2135
message: 'Unused CSS selector ".unused :global(.z)"',
2236
start: {
23-
line: 31,
37+
line: 40,
2438
column: 2,
25-
character: 283
39+
character: 386
2640
},
2741
end: {
28-
line: 31,
42+
line: 40,
2943
column: 21,
30-
character: 302
44+
character: 405
3145
}
3246
}
3347
]

packages/svelte/tests/css/samples/global-nested-block/expected.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88

99
.x {
1010
color: green;
11+
&:hover {
12+
color: green;
13+
}
14+
&div {
15+
color: green;
16+
}
17+
/* (unused) .unused {
18+
color: red;
19+
}*/
1120
}
1221

1322
p:where(.svelte-xyz) {

packages/svelte/tests/css/samples/global-nested-block/input.svelte

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
1111
:global(.x) {
1212
color: green;
13+
&:hover {
14+
color: green;
15+
}
16+
&div {
17+
color: green;
18+
}
19+
.unused {
20+
color: red;
21+
}
1322
}
1423
1524
p :global {

0 commit comments

Comments
 (0)