/* * Copyright (c) 2024 Kristóf Marussy * * SPDX-License-Identifier: MIT */ import { readFile, writeFile } from 'node:fs/promises'; import path from 'node:path'; import { promisify } from 'node:util'; import zlib from 'node:zlib'; import { Globby } from '@docusaurus/utils'; import { brotliOptions, gzipOptions, minRatio } from './compressionOptions.mjs'; const patterns = [ '**/*.html', 'atom.xml', 'feed.json', 'robots.txt', 'rss.xml', 'sitemap.xml', ]; const brotliCompress = promisify(zlib.brotliCompress); const gzip = promisify(zlib.gzip); async function compressSite() { const files = await Globby(patterns.map((s) => path.join('build', s))); const promises = files.map(async (file) => { const contents = await readFile(file); const maxLength = contents.length * minRatio; const gzipContents = await gzip(contents, gzipOptions); if (gzipContents.length <= maxLength) { await writeFile(`${file}.gz`, gzipContents); } const brotliContents = await brotliCompress(contents, brotliOptions); if (brotliContents.length <= maxLength) { await writeFile(`${file}.br`, brotliContents); } }); await Promise.all(promises); } // @ts-expect-error This file is run directly by nodejs, so top-level await is fine here. await compressSite();