import { Transform } from "node:stream"; import File from "vinyl"; import tmp from "tmp"; import { execFile } from "node:child_process"; import { readFileSync, unlinkSync } from "node:fs"; import { src, dest } from "gulp"; import hashPaths from "../hash.js"; const FONT_PRESETS = { mono: { ranges: ["20-7F", "2205", "2E22-2E25", "2713", "2717"] }, text: { ranges: ["20-7F", "A0-FF", "2000-206F", "20AC"] }, }; function compileFont() { return new Transform({ objectMode: true, async transform(chunk: File, _, callback) { const [, variant, weight] = /([A-Z][a-z]+)-(\w+)\.ttf$/.exec(chunk.basename); const tmpOutput = tmp.fileSync({ discardDescriptor: true }); const unicodes = FONT_PRESETS[variant.toLowerCase()].ranges; execFile("pyftsubset", [ chunk.path, `--unicodes=${unicodes.join(",")}`, `--output-file=${tmpOutput.name}`, "--flavor=woff2", ]).once("exit", () => { chunk.path = `iosevka-adaedra-${variant.toLowerCase()}-${weight.toLowerCase()}.woff2`; chunk.contents = readFileSync(tmpOutput.name); chunk.base = null; unlinkSync(tmpOutput.name); callback(null, chunk); }); }, }); } export const fonts = () => src("vendor/*.ttf") .pipe(compileFont()) .pipe(hashPaths("fonts.manifest")) .pipe(dest("dist/_assets"));