gulp-purgecss
Version:
Gulp plugin for purgecss
102 lines (98 loc) • 3.53 kB
JavaScript
;
var glob = require('fast-glob');
var PluginError = require('plugin-error');
var purgecss = require('purgecss');
var through = require('through2');
var applySourceMap = require('vinyl-sourcemaps-apply');
const PLUGIN_NAME = "gulp-purgecss";
function getFiles(contentArray, ignore) {
return contentArray.reduce((acc, content) => {
return [...acc, ...glob.sync(content, { ignore })];
}, []);
}
/**
*
* @param options - options
* @returns
*
* @public
*/
function gulpPurgeCSS(options) {
return through.obj(async function (file, _encoding, callback) {
// empty
if (file.isNull())
return callback(null, file);
// buffer
if (file.isBuffer()) {
try {
const optionsGulp = {
...options,
content: getFiles(options.content, options.skippedContentGlobs),
css: [
{
raw: file.contents.toString(),
},
],
stdin: true,
sourceMap: !!file.sourceMap,
};
const purgedCSSResults = await new purgecss.PurgeCSS().purge(optionsGulp);
const purge = purgedCSSResults[0];
const result = optionsGulp.rejected && purge.rejected
? purge.rejected.join(" {}\n") + " {}"
: purge.css;
file.contents = Buffer.from(result, "utf-8");
// apply source map to the chain
if (file.sourceMap) {
applySourceMap(file, purge.sourceMap);
}
callback(null, file);
}
catch (e) {
if (e instanceof Error) {
this.emit("error", new PluginError(PLUGIN_NAME, e.message));
}
}
}
// stream
if (file.isStream()) {
let css = "";
file.contents
.on("data", (buffer) => {
css += buffer.toString();
})
.on("end", async () => {
try {
const optionsGulp = {
...options,
css: [
{
raw: css,
},
],
sourceMap: !!file.sourceMap,
};
const purgedCSSResults = await new purgecss.PurgeCSS().purge(optionsGulp);
const purge = purgedCSSResults[0];
const result = optionsGulp.rejected && purge.rejected
? purge.rejected.join(" {}\n") + " {}"
: purge.css;
const streamResult = through();
streamResult.write(Buffer.from(result, "utf-8"));
file.contents = file.contents.pipe(streamResult);
// apply source map to the chain
if (file.sourceMap) {
applySourceMap(file, purge.sourceMap);
}
callback(null, file);
}
catch (e) {
if (e instanceof Error) {
this.emit("error", new PluginError(PLUGIN_NAME, e.message));
}
}
});
}
});
}
module.exports = gulpPurgeCSS;