Creator App Tests / PR Spam Gate (push) Skipped
Frontend Tests / PR Spam Gate (push) Skipped
NPM Format (website & console) / PR Spam Gate (push) Skipped
Pre-commit Checks / PR Spam Gate (push) Skipped
QwenPaw Creator Plugin Release / check-version (push) Canceled after 0s
QwenPaw Creator Plugin Release / upload-oss (push) Canceled after 0s
Tests / PR Spam Gate (push) Skipped
CodeQL / CodeQL (python) (push) Canceled after 0s
CodeQL / CodeQL (typescript) (push) Canceled after 0s
Creator App Tests / Creator Backend Tests (push) Canceled after 0s
Creator App Tests / Creator UI Build & Tests (push) Canceled after 0s
E2E Smoke Tests / Playwright UI Smoke (push) Canceled after 0s
Frontend Tests / Detect console changes (push) Canceled after 0s
NPM Format (website & console) / website format check (push) Canceled after 0s
NPM Format (website & console) / console format check (push) Canceled after 0s
Pre-commit Checks / Pre-commit (push) Canceled after 0s
QwenPaw Data Plugin Release / check-version (push) Canceled after 0s
Tests / Detect code changes (push) Canceled after 0s
Frontend Tests / Vitest Unit Tests (push) Canceled after 0s
Frontend Tests / Frontend Summary (push) Canceled after 0s
QwenPaw Data Plugin Release / upload-oss (push) Canceled after 0s
Tests / Maintainer Approval (push) Canceled after 0s
Tests / Unit Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - fallback (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p2 (push) Canceled after 0s
Tests / Coverage Report (push) Canceled after 0s
Tests / Test Summary (push) Canceled after 0s
56 lines
1.6 KiB
JavaScript
56 lines
1.6 KiB
JavaScript
import { readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
import { extname, join } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
import { promisify } from "node:util";
|
|
import { brotliCompress, constants, gzip } from "node:zlib";
|
|
|
|
const compressBrotli = promisify(brotliCompress);
|
|
const compressGzip = promisify(gzip);
|
|
const outputDirectory = new URL("../dist/", import.meta.url);
|
|
const compressibleExtensions = new Set([
|
|
".css",
|
|
".html",
|
|
".js",
|
|
".json",
|
|
".svg",
|
|
".txt",
|
|
".wasm",
|
|
]);
|
|
const minimumSize = 1024;
|
|
|
|
async function walk(directory) {
|
|
const entries = await readdir(directory, { withFileTypes: true });
|
|
const files = await Promise.all(
|
|
entries.map(async (entry) => {
|
|
const path = join(directory, entry.name);
|
|
return entry.isDirectory() ? walk(path) : [path];
|
|
}),
|
|
);
|
|
return files.flat();
|
|
}
|
|
|
|
async function compress(path) {
|
|
if (!compressibleExtensions.has(extname(path))) return false;
|
|
if ((await stat(path)).size < minimumSize) return false;
|
|
const source = await readFile(path);
|
|
const [brotli, gzipped] = await Promise.all([
|
|
compressBrotli(source, {
|
|
params: {
|
|
[constants.BROTLI_PARAM_QUALITY]: 6,
|
|
},
|
|
}),
|
|
compressGzip(source, { level: 6 }),
|
|
]);
|
|
await Promise.all([
|
|
writeFile(`${path}.br`, brotli),
|
|
writeFile(`${path}.gz`, gzipped),
|
|
]);
|
|
return true;
|
|
}
|
|
|
|
const outputPath = fileURLToPath(outputDirectory);
|
|
const files = await walk(outputPath);
|
|
const results = await Promise.all(files.map(compress));
|
|
const count = results.filter(Boolean).length;
|
|
console.log(`Precompressed ${count} Console assets.`);
|