import { readdir, readFile, writeFile } from 'node:fs/promises' import { extname, join } from 'node:path' import { promisify } from 'node:util' import { brotliCompress as brotli, constants, gzip as gzipCallback, } from 'node:zlib' const brotliCompress = promisify(brotli) const gzip = promisify(gzipCallback) await compressDirectory(new URL('../dist/', import.meta.url)) async function compressDirectory(directory) { for (const entry of await readdir(directory, { withFileTypes: true })) { const path = join(entry.parentPath, entry.name) if (entry.isDirectory()) { await compressDirectory(path) continue } if (!['.css', '.html', '.js', '.json', '.svg'].includes(extname(path))) continue const source = await readFile(path) const [brotliOutput, gzipOutput] = await Promise.all([ brotliCompress(source, { params: { [constants.BROTLI_PARAM_QUALITY]: 11, }, }), gzip(source, { level: 9 }), ]) await Promise.all([ writeFile(`${path}.br`, brotliOutput), writeFile(`${path}.gz`, gzipOutput), ]) } }