63 lines
3.2 KiB
JavaScript
63 lines
3.2 KiB
JavaScript
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import { brotliDecompressSync, gunzipSync } from "node:zlib";
|
|
import { afterEach, describe, expect, test } from "vitest";
|
|
|
|
import { precompressWebAssets, pruneUnreferencedDuplicateCss } from "./precompress-web-assets.mjs";
|
|
|
|
const temporaryDirectories = [];
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(temporaryDirectories.splice(0).map((directory) => rm(directory, { force: true, recursive: true })));
|
|
});
|
|
|
|
describe("precompressWebAssets", () => {
|
|
test("writes deterministic sidecars only for worthwhile static text assets", async () => {
|
|
const directory = await mkdtemp(path.join(os.tmpdir(), "hivegrid-precompress-"));
|
|
temporaryDirectories.push(directory);
|
|
const source = Buffer.from("const message = 'compressible';\n".repeat(500));
|
|
const jsPath = path.join(directory, "app.js");
|
|
await Promise.all([writeFile(jsPath, source), writeFile(path.join(directory, "small.json"), "{}")]);
|
|
|
|
const report = await precompressWebAssets(directory);
|
|
expect(report).toEqual({ considered: 1, brotliWritten: 1, gzipWritten: 1 });
|
|
expect(brotliDecompressSync(await readFile(`${jsPath}.br`))).toEqual(source);
|
|
expect(gunzipSync(await readFile(`${jsPath}.gz`))).toEqual(source);
|
|
await expect(readFile(path.join(directory, "small.json.br"))).rejects.toMatchObject({ code: "ENOENT" });
|
|
});
|
|
|
|
test("removes only byte-identical unreferenced React Router server CSS duplicates", async () => {
|
|
const directory = await mkdtemp(path.join(os.tmpdir(), "hivegrid-css-prune-"));
|
|
temporaryDirectories.push(directory);
|
|
const duplicateCss = Buffer.from(".root { color: green; }".repeat(100));
|
|
await Promise.all([
|
|
writeFile(path.join(directory, "root-hash.css"), duplicateCss),
|
|
writeFile(path.join(directory, "server-build-hash.css"), duplicateCss),
|
|
writeFile(path.join(directory, "manifest.js"), 'window.assets=["root-hash.css"];'),
|
|
]);
|
|
|
|
await expect(pruneUnreferencedDuplicateCss(directory)).resolves.toEqual({
|
|
removed: 1,
|
|
bytesRemoved: duplicateCss.length,
|
|
});
|
|
await expect(readFile(path.join(directory, "server-build-hash.css"))).rejects.toMatchObject({ code: "ENOENT" });
|
|
await expect(readFile(path.join(directory, "root-hash.css"))).resolves.toEqual(duplicateCss);
|
|
});
|
|
|
|
test("keeps referenced or non-identical server CSS assets", async () => {
|
|
const directory = await mkdtemp(path.join(os.tmpdir(), "hivegrid-css-prune-"));
|
|
temporaryDirectories.push(directory);
|
|
await Promise.all([
|
|
writeFile(path.join(directory, "root-hash.css"), ".root { color: green; }"),
|
|
writeFile(path.join(directory, "server-build-referenced.css"), ".root { color: green; }"),
|
|
writeFile(path.join(directory, "server-build-distinct.css"), ".root { color: red; }"),
|
|
writeFile(path.join(directory, "manifest.js"), 'window.assets=["server-build-referenced.css"];'),
|
|
]);
|
|
|
|
await expect(pruneUnreferencedDuplicateCss(directory)).resolves.toEqual({ removed: 0, bytesRemoved: 0 });
|
|
await expect(readFile(path.join(directory, "server-build-referenced.css"))).resolves.toBeTruthy();
|
|
await expect(readFile(path.join(directory, "server-build-distinct.css"))).resolves.toBeTruthy();
|
|
});
|
|
});
|