@hokify/penthouse
Version:
Generate critical path CSS for web pages
60 lines (45 loc) • 1.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = finalRuleRemover;
var _cssTree = _interopRequireDefault(require("css-tree"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function finalRuleRemover(ast, propertiesToRemove) {
// remove empty rules
_cssTree.default.walk(ast, {
visit: 'Rule',
leave: (rule, item, list) => {
if (rule.block.children.isEmpty()) {
list.remove(item);
}
}
}); // remove unwanted and empty at-rules
_cssTree.default.walk(ast, {
visit: 'Atrule',
leave: (atrule, item, list) => {
const name = _cssTree.default.keyword(atrule.name).basename;
/* ==@-rule handling== */
/* - Case 0 : Non nested @-rule [REMAIN]
(@charset, @import, @namespace)
*/
if (name === 'charset' || name === 'import' || name === 'namespace') {
return;
}
/* Case 1: @-rule with CSS properties inside [REMAIN]
@font-face, @keyframes - keep here, but remove later in code, unless it is used.
*/
if (name === 'font-face' || name === 'keyframes' || name === 'viewport') {
return;
}
/* Case 3: @-rule with CSS rules inside [REMAIN] */
// non matching media queries are stripped out in non-matching-media-query-remover.js
if (name === 'media' || name === 'document' || name === 'supports') {
if (atrule.block && !atrule.block.children.isEmpty()) {
return;
}
} // otherwise remove the at-rule
list.remove(item);
}
});
}