@sequencemedia/css-purge
Version:
A CSS tool written in Node JS as a command line app or library for the purging, burning, reducing, shortening, compressing, cleaning, trimming and formatting of duplicate, extra, excess or bloated CSS.
81 lines (67 loc) • 1.85 kB
JavaScript
import debug from 'debug'
import escape from '#utils/escape'
const log = debug('@sequencemedia/css-purge/remove-unused')
const info = debug('@sequencemedia/css-purge:info')
function has (collection) {
return function match (member) {
return collection.includes(member)
}
}
function getRemoveUnusedSelectors (rules, selectors, i) {
return function removeUnusedSelectors (rule) {
selectors
.forEach(getRemoveUnusedSelector(rules, selectors, rule, i))
}
}
function getRemoveUnusedSelector (rules, selectors, rule, i) {
return function removeUnusedSelector (selector) {
const pattern = `^(.${selector}|${selector})$`
const regExp = (
selector.includes('[') ||
selector.includes('*')
)
? new RegExp(escape(pattern, 'gm'))
: new RegExp(pattern, 'gm')
const {
selectors: SELECTORS
} = rule
if (SELECTORS.join(',').match(regExp)) {
if (SELECTORS.length > 1) {
if (!SELECTORS.some(has(selectors))) rules.splice(i, 1)
} else {
rules.splice(i, 1)
}
}
}
}
function getRemoveUnusedSelectorsForRules (rules, selectors) {
return function removeUnusedSelectorsForRules (rule, i) {
const {
type
} = rule
if (type === 'rule') {
selectors
.forEach(getRemoveUnusedSelector(rules, selectors, rule, i))
} else {
if (
type === 'document' ||
type === 'supports' ||
type === 'media'
) {
const {
rules
} = rule
if (Array.isArray(rules)) {
rules
.forEach(getRemoveUnusedSelectors(rules, selectors, i))
}
}
}
}
}
log('`css-purge` is awake')
export default function removeUnused (rules, selectors) {
info('Remove unused')
rules
.forEach(getRemoveUnusedSelectorsForRules(rules, selectors))
}