Skip to content

Commit 0ee1968

Browse files
committed
Fix issue #245 with recursive filtering
1 parent 5448282 commit 0ee1968

File tree

4 files changed

+75
-50
lines changed

4 files changed

+75
-50
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
.vscode
12
node_modules

src/styleSheetSerializer.js

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,18 @@ const includesClassNames = (classNames, selectors) =>
5252
const filterRules = classNames => rule =>
5353
rule.type === 'rule' && includesClassNames(classNames, rule.selectors) && rule.declarations.length;
5454

55-
const getAtRules = (ast, filter) =>
56-
ast.stylesheet.rules
57-
.filter(rule => rule.type === 'media' || rule.type === 'supports')
58-
.reduce((acc, atRule) => {
59-
atRule.rules = atRule.rules.filter(filter);
60-
61-
return acc.concat(atRule);
62-
}, []);
55+
const getAllRules = (rules, classNames) => rules
56+
.filter(
57+
rule => rule.type === 'media'
58+
|| rule.type === 'supports'
59+
|| (rule.type === 'rule' && includesClassNames(classNames, rule.selectors) && rule.declarations.length)
60+
)
61+
.map(rule => (rule.type === "rule" ? rule : Object.assign({}, rule, { rules: getAllRules(rule.rules, classNames) })));
6362

6463
const getStyle = classNames => {
6564
const ast = getCSS();
66-
const filter = filterRules(classNames);
67-
const rules = ast.stylesheet.rules.filter(filter);
68-
const atRules = getAtRules(ast, filter);
6965

70-
ast.stylesheet.rules = rules.concat(atRules);
66+
ast.stylesheet.rules = getAllRules(ast.stylesheet.rules, classNames);
7167

7268
return css.stringify(ast);
7369
};
@@ -93,8 +89,8 @@ const replaceClassNames = (result, classNames, style) =>
9389
.reduce((acc, className, index) => acc.replace(new RegExp(className, 'g'), `c${index++}`), result);
9490

9591
const stripUnreferencedClassNames = (result, classNames) =>
96-
classNames
97-
.reduce((acc, className) => acc.replace(new RegExp(`${className}\\s?`,'g'), ''), result);
92+
classNames
93+
.reduce((acc, className) => acc.replace(new RegExp(`${className}\\s?`, 'g'), ''), result);
9894

9995
const replaceHashes = (result, hashes) =>
10096
hashes.reduce(

test/__snapshots__/styleSheetSerializer.spec.js.snap

Lines changed: 60 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -727,15 +727,6 @@ exports[`supported css: mount 1`] = `
727727
background: palevioletred;
728728
}
729729
730-
.c0 > p {
731-
-webkit-text-decoration: underline;
732-
text-decoration: underline;
733-
}
734-
735-
html.test .c0 {
736-
display: none;
737-
}
738-
739730
@media (max-width:600px) {
740731
.c0 {
741732
background: tomato;
@@ -744,6 +735,21 @@ html.test .c0 {
744735
.c0:hover {
745736
background: yellow;
746737
}
738+
739+
@supports (top:max(1px,0px)) {
740+
.c0 {
741+
padding-left: max(1em,env(safe-area-inset-left,0px));
742+
}
743+
}
744+
}
745+
746+
.c0 > p {
747+
-webkit-text-decoration: underline;
748+
text-decoration: underline;
749+
}
750+
751+
html.test .c0 {
752+
display: none;
747753
}
748754
749755
<styled.div>
@@ -767,15 +773,6 @@ exports[`supported css: react-test-renderer 1`] = `
767773
background: palevioletred;
768774
}
769775
770-
.c0 > p {
771-
-webkit-text-decoration: underline;
772-
text-decoration: underline;
773-
}
774-
775-
html.test .c0 {
776-
display: none;
777-
}
778-
779776
@media (max-width:600px) {
780777
.c0 {
781778
background: tomato;
@@ -784,6 +781,21 @@ html.test .c0 {
784781
.c0:hover {
785782
background: yellow;
786783
}
784+
785+
@supports (top:max(1px,0px)) {
786+
.c0 {
787+
padding-left: max(1em,env(safe-area-inset-left,0px));
788+
}
789+
}
790+
}
791+
792+
.c0 > p {
793+
-webkit-text-decoration: underline;
794+
text-decoration: underline;
795+
}
796+
797+
html.test .c0 {
798+
display: none;
787799
}
788800
789801
<div
@@ -805,15 +817,6 @@ exports[`supported css: react-testing-library 1`] = `
805817
background: palevioletred;
806818
}
807819
808-
.c0 > p {
809-
-webkit-text-decoration: underline;
810-
text-decoration: underline;
811-
}
812-
813-
html.test .c0 {
814-
display: none;
815-
}
816-
817820
@media (max-width:600px) {
818821
.c0 {
819822
background: tomato;
@@ -822,6 +825,21 @@ html.test .c0 {
822825
.c0:hover {
823826
background: yellow;
824827
}
828+
829+
@supports (top:max(1px,0px)) {
830+
.c0 {
831+
padding-left: max(1em,env(safe-area-inset-left,0px));
832+
}
833+
}
834+
}
835+
836+
.c0 > p {
837+
-webkit-text-decoration: underline;
838+
text-decoration: underline;
839+
}
840+
841+
html.test .c0 {
842+
display: none;
825843
}
826844
827845
<div
@@ -843,15 +861,6 @@ exports[`supported css: shallow 1`] = `
843861
background: palevioletred;
844862
}
845863
846-
.c0 > p {
847-
-webkit-text-decoration: underline;
848-
text-decoration: underline;
849-
}
850-
851-
html.test .c0 {
852-
display: none;
853-
}
854-
855864
@media (max-width:600px) {
856865
.c0 {
857866
background: tomato;
@@ -860,6 +869,21 @@ html.test .c0 {
860869
.c0:hover {
861870
background: yellow;
862871
}
872+
873+
@supports (top:max(1px,0px)) {
874+
.c0 {
875+
padding-left: max(1em,env(safe-area-inset-left,0px));
876+
}
877+
}
878+
}
879+
880+
.c0 > p {
881+
-webkit-text-decoration: underline;
882+
text-decoration: underline;
883+
}
884+
885+
html.test .c0 {
886+
display: none;
863887
}
864888
865889
<div

test/styleSheetSerializer.spec.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ it('supported css', () => {
179179
&:hover {
180180
background: yellow;
181181
}
182+
183+
@supports (top: max(1px, 0px)) {
184+
padding-left: max(1em, env(safe-area-inset-left, 0px));
185+
}
182186
}
183187
184188
> p {

0 commit comments

Comments
 (0)