gulp-purgecss
Version:
Gulp plugin for purgecss
100 lines (97 loc) • 3.49 kB
JavaScript
import glob from 'fast-glob';
import PluginError from 'plugin-error';
import { PurgeCSS } from 'purgecss';
import through from 'through2';
import applySourceMap from '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().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().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));
}
}
});
}
});
}
export { gulpPurgeCSS as default };