-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
55 lines (45 loc) · 1.25 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import cheerio from 'cheerio';
import cssParser from 'css';
export default function removeUnusedCss(html, css){
var obj = cssParser.parse(css);
var $ = cheerio.load(html);
let newRules = obj.stylesheet.rules.reduce((acc, rule) => {
if(rule.type === 'rule'){
let newRule = processRule(rule, $);
if(newRule.selectors.length){
// if the rule matched any selector at all
acc.push(newRule);
}
} else if(rule.type === 'media'){
let media = processMedia(rule, $);
if(media.rules.length){
// if any rules inside the media query matched
acc.push(media);
}
}
return acc;
}, []);
obj.stylesheet.rules = newRules;
return cssParser.stringify(obj);
}
function processRule(rule, $){
let usedSelectors = rule.selectors.filter(sel => !!$(sel).length);
rule.selectors = usedSelectors;
return rule;
}
function processMedia(media, $){
let newRules = media.rules.reduce((acc, rule) => {
if(rule.type === 'rule'){
let result = processRule(rule, $);
if(result.selectors.length){
// if the rule matched any selector at all
acc.push(result);
}
} else {
acc.push(rule);
}
return acc;
}, []);
media.rules = newRules;
return media;
}