tools/__tasks__/compile/inline-svgs/index.mjs (52 lines of code) (raw):
import path from 'node:path';
import fs from 'node:fs';
import mkdirp from 'mkdirp';
import glob from 'glob';
import { optimize } from 'svgo';
import pify from 'pify';
const readFile = pify(fs.readFile);
const writeFile = pify(fs.writeFile);
import { paths } from '../../config.mjs';
const srcDir = path.resolve(paths.src, 'inline-svgs');
/** @type {import('listr2').ListrTask} */
const task = {
title: 'Prepare inline SVGs',
task: () =>
Promise.all(
glob.sync('**/*.svg', { cwd: srcDir }).map((svgPath) => {
const dest = path.resolve(paths.conf, 'inline-svgs', svgPath);
return mkdirp(path.dirname(dest))
.then(() =>
readFile(path.resolve(srcDir, svgPath), 'utf-8'),
)
.then(
(fileData) =>
new Promise((resolve) =>
resolve(
optimize(fileData, {
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false,
},
},
},
'removeXMLNS',
],
}),
),
),
)
.then((optimisedFileData) => {
if (!optimisedFileData?.data) {
console.error('error inlining:', srcDir, svgPath);
return Promise.resolve();
}
return writeFile(dest, optimisedFileData.data);
});
}),
),
};
export default task;