| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | 
							- var hasOwnProperty = Object.prototype.hasOwnProperty;
 
- var walk = require('css-tree').walk;
 
- var { hasNoChildren } = require('./utils');
 
- function cleanUnused(selectorList, usageData) {
 
-     selectorList.children.each(function(selector, item, list) {
 
-         var shouldRemove = false;
 
-         walk(selector, function(node) {
 
-             // ignore nodes in nested selectors
 
-             if (this.selector === null || this.selector === selectorList) {
 
-                 switch (node.type) {
 
-                     case 'SelectorList':
 
-                         // TODO: remove toLowerCase when pseudo selectors will be normalized
 
-                         // ignore selectors inside :not()
 
-                         if (this.function === null || this.function.name.toLowerCase() !== 'not') {
 
-                             if (cleanUnused(node, usageData)) {
 
-                                 shouldRemove = true;
 
-                             }
 
-                         }
 
-                         break;
 
-                     case 'ClassSelector':
 
-                         if (usageData.whitelist !== null &&
 
-                             usageData.whitelist.classes !== null &&
 
-                             !hasOwnProperty.call(usageData.whitelist.classes, node.name)) {
 
-                             shouldRemove = true;
 
-                         }
 
-                         if (usageData.blacklist !== null &&
 
-                             usageData.blacklist.classes !== null &&
 
-                             hasOwnProperty.call(usageData.blacklist.classes, node.name)) {
 
-                             shouldRemove = true;
 
-                         }
 
-                         break;
 
-                     case 'IdSelector':
 
-                         if (usageData.whitelist !== null &&
 
-                             usageData.whitelist.ids !== null &&
 
-                             !hasOwnProperty.call(usageData.whitelist.ids, node.name)) {
 
-                             shouldRemove = true;
 
-                         }
 
-                         if (usageData.blacklist !== null &&
 
-                             usageData.blacklist.ids !== null &&
 
-                             hasOwnProperty.call(usageData.blacklist.ids, node.name)) {
 
-                             shouldRemove = true;
 
-                         }
 
-                         break;
 
-                     case 'TypeSelector':
 
-                         // TODO: remove toLowerCase when type selectors will be normalized
 
-                         // ignore universal selectors
 
-                         if (node.name.charAt(node.name.length - 1) !== '*') {
 
-                             if (usageData.whitelist !== null &&
 
-                                 usageData.whitelist.tags !== null &&
 
-                                 !hasOwnProperty.call(usageData.whitelist.tags, node.name.toLowerCase())) {
 
-                                 shouldRemove = true;
 
-                             }
 
-                             if (usageData.blacklist !== null &&
 
-                                 usageData.blacklist.tags !== null &&
 
-                                 hasOwnProperty.call(usageData.blacklist.tags, node.name.toLowerCase())) {
 
-                                 shouldRemove = true;
 
-                             }
 
-                         }
 
-                         break;
 
-                 }
 
-             }
 
-         });
 
-         if (shouldRemove) {
 
-             list.remove(item);
 
-         }
 
-     });
 
-     return selectorList.children.isEmpty();
 
- }
 
- module.exports = function cleanRule(node, item, list, options) {
 
-     if (hasNoChildren(node.prelude) || hasNoChildren(node.block)) {
 
-         list.remove(item);
 
-         return;
 
-     }
 
-     var usageData = options.usage;
 
-     if (usageData && (usageData.whitelist !== null || usageData.blacklist !== null)) {
 
-         cleanUnused(node.prelude, usageData);
 
-         if (hasNoChildren(node.prelude)) {
 
-             list.remove(item);
 
-             return;
 
-         }
 
-     }
 
- };
 
 
  |