UNPKG

purify-css

Version:

Removed unused css. Compatible with single-page apps.

71 lines (60 loc) 2.03 kB
const fs = require("fs") import CleanCss from "clean-css" import CssTreeWalker from "./CssTreeWalker" import FileUtil from "./utils/FileUtil" import PrintUtil from "./utils/PrintUtil" import SelectorFilter from "./SelectorFilter" import { getAllWordsInContent } from "./utils/ExtractWordsUtil" const OPTIONS = { output: false, minify: false, info: false, rejected: false, whitelist: [], cleanCssOptions: {} } const getOptions = (options = {}) => { let opt = {} for (let option in OPTIONS) { opt[option] = options[option] || OPTIONS[option] } return opt } const minify = (cssSource, options) => new CleanCss(options).minify(cssSource).styles const purify = (searchThrough, css, options, callback) => { if (typeof options === "function") { callback = options options = {} } options = getOptions(options) let cssString = FileUtil.filesToSource(css, "css"), content = FileUtil.filesToSource(searchThrough, "content") PrintUtil.startLog(minify(cssString).length) let wordsInContent = getAllWordsInContent(content), selectorFilter = new SelectorFilter(wordsInContent, options.whitelist), tree = new CssTreeWalker(cssString, [selectorFilter]) tree.beginReading() let source = tree.toString() source = options.minify ? minify(source, options.cleanCssOptions) : source // Option info = true if (options.info) { if (options.minify) { PrintUtil.printInfo(source.length) } else { PrintUtil.printInfo(minify(source, options.cleanCssOptions).length) } } // Option rejected = true if (options.rejected && selectorFilter.rejectedSelectors.length) { PrintUtil.printRejected(selectorFilter.rejectedSelectors) } if (options.output) { fs.writeFile(options.output, source, err => { if (err) return err }) } else { return callback ? callback(source) : source } } export default purify