tools/__tasks__/compile/images/svg.mjs (48 lines of code) (raw):
import path from 'node:path';
import fs from 'node:fs';
import glob from 'glob';
import pify from 'pify';
const readFile = pify(fs.readFile);
const stat = pify(fs.stat);
import { paths } from '../../config.mjs';
const srcDir = path.resolve(paths.src);
/** @type {import('listr2').ListrTask} */
const task = {
title: 'Prohibit inline data URIs in svgs and other unoptimised things',
task: () =>
Promise.all(
glob.sync('**/*.svg', { cwd: srcDir }).map((svgPath) =>
Promise.all([
stat(path.resolve(srcDir, svgPath)).then(
(fileStats) =>
new Promise((resolve, reject) => {
if (fileStats.size > 136 * 1000) {
reject(
new Error(
`whooahh ${svgPath} is much too large at ${
fileStats.size / 1000
}kB`,
),
);
}
resolve();
}),
),
readFile(path.resolve(srcDir, svgPath), 'utf-8').then(
(fileData) =>
new Promise((resolve, reject) => {
if (fileData.includes(';base64,')) {
reject(
new Error(
`base64 encoded data detected in ${svgPath}`,
),
);
}
resolve();
}),
),
]),
),
),
};
export default task;