Skip to content

Commit

Permalink
Switch to postcss to use uri optimization plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
captbaritone committed Jan 9, 2023
1 parent cb3ee6b commit f9f6990
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
3 changes: 3 additions & 0 deletions packages/webamp/postcss.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
plugins: [require("./scripts/postcss-optimize-data-uri-pngs")],
};
37 changes: 37 additions & 0 deletions packages/webamp/scripts/postcss-optimize-data-uri-pngs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const postcss = require("postcss");
const dataUriToBuffer = require("data-uri-to-buffer");
const imagemin = require("imagemin");
const imageminOptipng = require("imagemin-optipng");

const DATA_URL_REGEX = new RegExp(/url\((data:image\/png;base64,.+)\)/gi);
const DATA_URL_PROPS_REGEX = /^(background(?:-image)?)|(content)|(cursor)/;

async function optimizeDataUri(dataUri) {
const buffer = dataUriToBuffer(dataUri);
const optimized = await imagemin.buffer(buffer, {
use: [imageminOptipng()],
});
return `data:image/png;base64,${optimized.toString("base64")}`;
}

module.exports = postcss.plugin("postcss-optimize-data-uri-pngs", () => {
return async function (css) {
// walkDecls does not let us work async, so we collect the async work we
// need to do here, and await it at the end
const promisesFactories = [];
css.walkDecls(DATA_URL_PROPS_REGEX, (decl) => {
let matches;
// WTF JavaScript. This is the worst API for iterating RegEx matches.
while ((matches = DATA_URL_REGEX.exec(decl.value))) {
const [, dataUri] = matches;
promisesFactories.push(async () => {
decl.value = decl.value.replace(
dataUri,
await optimizeDataUri(dataUri)
);
});
}
});
await Promise.all(promisesFactories.map((p) => p()));
};
});
11 changes: 11 additions & 0 deletions packages/webamp/scripts/postcss-optimize-data-uri-pngs.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const fs = require("fs");
const postcss = require("postcss");

const plugin = require("./postcss-optimize-data-uri-pngs");

const css = fs.readFileSync("./css/base-skin.css", "utf8");
// This seems to timeout a lot in CI
it.skip("does something", async () => {
const result = await postcss([plugin({})]).process(css);
expect(result.css.length).toBeLessThan(css.length);
});

0 comments on commit f9f6990

Please sign in to comment.