Skip to content

Commit 8477258

Browse files
committed
fix incorrect media query syntax
oops...
1 parent 52430e0 commit 8477258

File tree

4 files changed

+36
-16
lines changed

4 files changed

+36
-16
lines changed

src/StyleSheet.js

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,23 @@ module.exports = class StyleSheet {
1313
}
1414

1515
toString() {
16-
const usedRules = this.rules
17-
.filter(({className}) => this.usage.includes(className))
18-
.map(({selector, cssText}) => `${selector} {${cssText}}`);
16+
// filter unused rules
17+
const filtered = this.rules.filter(({className}) => this.usage.includes(className));
1918

20-
const dedupe = usedRules.filter((rule, i) => i === usedRules.indexOf(rule));
19+
// group rules by media query
20+
const grouped = filtered.reduce((map, {selector, media, cssText}) => {
21+
// using a set to deduplicate rules within a given media query scope
22+
if (!map.has(media)) map.set(media, new Set());
23+
map.get(media).add(`${selector} {${cssText}}`);
24+
return map;
25+
}, new Map());
2126

22-
return dedupe.join('\n');
27+
// turn the rule objects into valid css rules
28+
return Array.from(grouped.entries())
29+
.map(([media, rules]) => {
30+
const cssText = [...rules.values()].join('\n');
31+
return media ? media + '{\n' + cssText + '\n}' : cssText;
32+
})
33+
.join('\n');
2334
}
2435
};

src/babel/__tests__/__snapshots__/index.test.js.snap

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,17 @@ export const ComponentWithParentPseudo = () => <div className={\\"xashdej x1dp08
3838

3939
exports[`media-query.jsx 2`] = `
4040
.x1dqz7z3 {color:red}
41-
.x1lrxh9v {@media screen and (min-width: 678px){color:green}}
4241
.x1ug2cuz {color:black}
43-
.xj95doo {@media screen and (min-width: 678px){color:yellow}}
4442
.x17bvl1g {color:brown}
45-
.xkuztku {@media screen and (min-width: 678px){color:salmon}}
4643
.xfxv4bd {color:silver}
47-
.x1oikiae:hover {@media screen and (min-width: 678px){color:gold}}
4844
.xashdej {color:wheat}
49-
.x1dp08z:hover {@media screen and (min-width: 678px){color:sandybrown}}
45+
@media screen and (min-width: 678px){
46+
.x1lrxh9v {color:green}
47+
.xj95doo {color:yellow}
48+
.xkuztku {color:salmon}
49+
.x1oikiae:hover {color:gold}
50+
.x1dp08z:hover {color:sandybrown}
51+
}
5052
`;
5153

5254
exports[`merging.jsx 1`] = `"export const Component = () => <div className={\\"xp5623v\\"} />;"`;

src/babel/utils/atomizer.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
const fnv1a = require('fnv1a');
22

3+
const AT_REG = /^@/;
4+
const AMP = /&/g;
5+
const COLON = /^:/;
6+
37
const id = seed => 'x' + fnv1a(seed).toString(36);
48
const hyphenate = s => s.replace(/[A-Z]|^ms/g, '-$&').toLowerCase();
59

610
const createRule = (className, key, value, children, media) => {
711
const hyphenated = hyphenate(key);
812
let cssText = hyphenated + ':' + value;
13+
let selector = '.' + className;
14+
15+
if (children) {
16+
selector += (COLON.test(children) ? '' : ' ') + children;
17+
}
918

1019
return {
1120
key: media + children + hyphenated,
12-
selector: '.' + className + children,
21+
selector: selector,
22+
cssText: cssText,
1323
media,
14-
cssText: media ? media + '{' + cssText + '}' : cssText,
1524
};
1625
};
1726

18-
const AT_REG = /^@/;
19-
const AMP = /&/g;
20-
2127
const parse = (obj, children = '', media = '') => {
2228
const rules = [];
2329

src/babel/visitors/TaggedTemplateExpression.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,12 @@ function TaggedTemplateExpression(path, state, types) {
4545

4646
const rules = atomizer(css_to_object(cssText));
4747

48-
rules.forEach(([className, {selector, cssText}]) => {
48+
rules.forEach(([className, {selector, cssText, media}]) => {
4949
state.styleSheet.addRule({
5050
className,
5151
selector,
5252
cssText,
53+
media,
5354
});
5455
});
5556

0 commit comments

Comments
 (0)