UNPKG

@zokki/astro-brotli

Version:

brotli compression for astro static sites

53 lines (52 loc) 2.11 kB
// src/index.ts import { reductionMessage } from "@zokki/integration-utils"; import { glob } from "glob"; import { createReadStream, createWriteStream } from "node:fs"; import { promises } from "node:stream"; import { fileURLToPath } from "node:url"; import { constants, createBrotliCompress } from "node:zlib"; var defaultExtension = ["css", "js", "html", "xml", "cjs", "mjs", "svg", "txt"]; var brotli = (config) => ({ name: "@zokki/brotli", hooks: { "astro:build:done": async ({ dir, logger }) => { const outDir = fileURLToPath(dir); const extensionsToCompress = config?.extensions ?? defaultExtension; const brotliOptions = { ...config?.brotliOptions, params: { [constants.BROTLI_PARAM_QUALITY]: 11, ...config?.brotliOptions?.params } }; let originalSizeSum = 0; let compressedSizeSum = 0; await glob(`${outDir}**/*.{${extensionsToCompress.join(",")}}`).then( (files) => Promise.all( files.map(async (file) => { const brotliFile = `${file}.br`; const read = createReadStream(file); const write = createWriteStream(brotliFile); const brotli2 = createBrotliCompress(brotliOptions); await promises.pipeline(read, brotli2, write); const originalSize = read.bytesRead; const compressedSize = write.bytesWritten; originalSizeSum += originalSize; compressedSizeSum += compressedSize; if (config?.logAllFiles !== false) { const relativePath = brotliFile.replace(outDir, "/").padEnd(45); const reductionStr = reductionMessage(originalSize, compressedSize); logger.info(`${relativePath} ${reductionStr}`); } }) ) ); if (originalSizeSum) { const reduction = reductionMessage(originalSizeSum, compressedSizeSum); logger.info(`Brotli completed successfully! (total reduction: ${reduction})`); } else { logger.info("Nothing were compressed with brotli."); } } } }); export { brotli };