uselesscss
Version:
Trim bloat from your CSS by only including rules that will actually be active.
5 lines • 2.11 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:true});exports.default=Useless;var _css=require('css');var _css2=_interopRequireDefault(_css);var _htmlparser=require('htmlparser2');var _cssSelect=require('css-select');var _cssSelect2=_interopRequireDefault(_cssSelect);var _cssesc=require('cssesc');var _cssesc2=_interopRequireDefault(_cssesc);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}/**
* Useless(html, css) -> css
*/function Useless(html,css){var dom=(0,_htmlparser.parseDOM)(html);return reduceCss(css);function reduceCss(css){var ast=_css2.default.parse(css||'');var candidateRules=ast.stylesheet.rules;var activeRules=candidateRules.map(function(rule){switch(rule.type){case'rule':rule.selectors=rule.selectors.filter(filterSelector);return rule.selectors.length===0?null:rule;case'media':rule.rules=rule.rules.filter(function(rule){return rule.type==='rule';}).map(function(rule){rule.selectors=rule.selectors.filter(filterSelector);return rule.selectors.length===0?null:rule;}).filter(function(rule){return rule!==null&&rule!==undefined;});return rule.rules.length===0?null:rule;case'comment':// curently not including comments
break;case'keyframes':return rule;case'font-face':return rule;default:console.error('Unknown rule! Add '+rule.type+' as case to switch on!');return rule;}}).filter(function(rule){return rule!==null&&rule!==undefined;});ast.stylesheet.rules=activeRules;return _css2.default.stringify(ast);}function filterSelector(selector){var result=false;var override=/(@|(:link)|(:visited)|:(active)|(:hover)|(:focus)|(:target)|(:lang)|(:disable)|(:enabled)|(:checked)|(::)|(:before)|(:after))/;if(override.test(selector)){if(/::/.test(selector)){selector=selector.substring(0,selector.lastIndexOf('::'));}else{selector=selector.substring(0,selector.lastIndexOf(':'));}}var selection=void 0;try{selection=(0,_cssSelect2.default)(selector,dom);}catch(e){selection=(0,_cssSelect2.default)((0,_cssesc2.default)(selector,{isIdentifier:true}),dom);}result=selection.length>0;return result;}}
//# sourceMappingURL=uselesscss.js.map
;