@zokki/astro-brotli
Version:
brotli compression for astro static sites
53 lines (52 loc) • 2.11 kB
JavaScript
// 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
};