Skip to content

Commit ee98dcc

Browse files
Sergey BondarSergey Bondar
Sergey Bondar
authored and
Sergey Bondar
committed
fix: MadLittleMods#130 variables in nested comma-separated selectors
1 parent f791dd2 commit ee98dcc

File tree

4 files changed

+114
-29
lines changed

4 files changed

+114
-29
lines changed

index.js

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -234,40 +234,38 @@ module.exports = (options = {}) => {
234234
});
235235

236236
if (doesRuleUseVariables) {
237-
rulesThatHaveDeclarationsWithVariablesList.push(rule);
237+
if (rule.type === "rule" && rule.selectors.length > 1) {
238+
// Split out the rule into each comma separated selector piece
239+
// We only need to split if it's actually a Rule with multiple selectors (comma separated)
240+
// duplicate rules would be probably merged with cssnano (cannot be sure about nested)
241+
rule.selectors.reverse().forEach(function(selector) {
242+
var ruleClone = rule.cloneAfter();
243+
ruleClone.selector = selector;
244+
245+
return ruleClone;
246+
});
247+
248+
// Rules will be added to list in the next traverse
249+
rule.remove();
250+
} else {
251+
rulesThatHaveDeclarationsWithVariablesList.push(rule);
252+
}
238253
}
239254
});
240255

241256
rulesThatHaveDeclarationsWithVariablesList.forEach(function(rule) {
242-
var rulesToWorkOn = [].concat(rule);
243-
// Split out the rule into each comma separated selector piece
244-
// We only need to split if it's actually a Rule with multiple selectors (comma separated)
245-
if (rule.type === "rule" && rule.selectors.length > 1) {
246-
// Reverse the selectors so that we can cloneAfter in the same comma separated order
247-
rulesToWorkOn = rule.selectors.reverse().map(function(selector) {
248-
var ruleClone = rule.cloneAfter();
249-
ruleClone.selector = selector;
250-
251-
return ruleClone;
252-
});
253-
254-
rule.remove();
255-
}
256-
257257
// Resolve the declarations
258-
rulesToWorkOn.forEach(function(ruleToWorkOn) {
259-
ruleToWorkOn.nodes.slice(0).forEach(function(node) {
260-
if (node.type === "decl") {
261-
var decl = node;
262-
resolveDecl(
263-
decl,
264-
map,
265-
opts.preserve,
266-
opts.preserveAtRulesOrder,
267-
logResolveValueResult
268-
);
269-
}
270-
});
258+
rule.nodes.slice(0).forEach(function(node) {
259+
if (node.type === "decl") {
260+
var decl = node;
261+
resolveDecl(
262+
decl,
263+
map,
264+
opts.preserve,
265+
opts.preserveAtRulesOrder,
266+
logResolveValueResult
267+
);
268+
}
271269
});
272270
});
273271

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
:root {
2+
--some-width: 150px;
3+
}
4+
:root {
5+
--White1: #FFF;
6+
}
7+
8+
.a {
9+
width: var(--some-width);
10+
11+
a, label, &:after {
12+
color: var(--White1);
13+
}
14+
}
15+
16+
/* postcss-nested double parent selector case */
17+
.a, .b {
18+
/* here variable */
19+
width: var(--some-width);
20+
21+
/* and here another */
22+
a, label {
23+
background: var(--White1);
24+
25+
li {
26+
width: var(--some-width);
27+
}
28+
}
29+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
2+
.a {
3+
width: 150px;
4+
5+
a {
6+
color: #FFF
7+
}
8+
9+
label {
10+
color: #FFF
11+
}
12+
13+
&:after {
14+
color: #FFF
15+
}
16+
}
17+
18+
.a {
19+
width: 150px;
20+
21+
a {
22+
background: #FFF;
23+
24+
li {
25+
width: 150px;
26+
}
27+
}
28+
label {
29+
background: #FFF;
30+
31+
li {
32+
width: 150px;
33+
}
34+
}
35+
}
36+
37+
.b {
38+
width: 150px;
39+
40+
a {
41+
background: #FFF;
42+
43+
li {
44+
width: 150px;
45+
}
46+
}
47+
label {
48+
background: #FFF;
49+
50+
li {
51+
width: 150px;
52+
}
53+
}
54+
}

test/test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ var cssvariables = require("../");
1212
var cssnano = require("cssnano");
1313
var normalizeWhitespace = require("postcss-normalize-whitespace");
1414
var discardComments = require("postcss-discard-comments");
15+
var nestedCss = require("postcss-nested");
16+
var importCss = require("postcss-import");
1517

1618
var MOCK_JS_VARIABLES = {
1719
"--js-defined1": "75px",
@@ -186,6 +188,8 @@ describe("postcss-css-variables", function() {
186188

187189
test("should cascade to nested rules", "cascade-on-nested-rules");
188190

191+
test("should cascade to nested multiple rules", "cascade-and-multiple-on-nested-rules");
192+
189193
test(
190194
"should cascade with calc-expression to nested rules",
191195
"cascade-with-calc-expression-on-nested-rules"

0 commit comments

Comments
 (0)