72 lines
1.8 KiB
JavaScript
72 lines
1.8 KiB
JavaScript
const esbuild = require("esbuild");
|
|
const fs = require("fs");
|
|
const minimize = require("minimize");
|
|
const path = require("path");
|
|
|
|
const iterations = parseInt(process.env.MHB_ITERATIONS, 10);
|
|
const inputDir = process.env.MHB_INPUT_DIR;
|
|
const htmlOnly = process.env.MHB_HTML_ONLY === "1";
|
|
|
|
const jsMime = new Set([
|
|
undefined,
|
|
"application/ecmascript",
|
|
"application/javascript",
|
|
"application/x-ecmascript",
|
|
"application/x-javascript",
|
|
"text/ecmascript",
|
|
"text/javascript",
|
|
"text/javascript1.0",
|
|
"text/javascript1.1",
|
|
"text/javascript1.2",
|
|
"text/javascript1.3",
|
|
"text/javascript1.4",
|
|
"text/javascript1.5",
|
|
"text/jscript",
|
|
"text/livescript",
|
|
"text/x-ecmascript",
|
|
"text/x-javascript",
|
|
]);
|
|
|
|
const esbuildCss = (code) =>
|
|
esbuild.transformSync(code, {
|
|
loader: "css",
|
|
minify: true,
|
|
}).code;
|
|
|
|
const esbuildJs = (code) =>
|
|
esbuild.transformSync(code, {
|
|
loader: "js",
|
|
minify: true,
|
|
}).code;
|
|
|
|
const jsCssPlugin = {
|
|
id: "esbuild",
|
|
element: (node, next) => {
|
|
if (node.type === "text" && node.parent) {
|
|
if (
|
|
node.parent.type === "script" &&
|
|
jsMime.has(node.parent.attribs.type)
|
|
) {
|
|
node.data = esbuildJs(node.data);
|
|
} else if (node.parent.type === "style") {
|
|
node.data = esbuildCss(node.data);
|
|
}
|
|
}
|
|
next();
|
|
},
|
|
};
|
|
|
|
const plugins = htmlOnly ? [] : [jsCssPlugin];
|
|
|
|
const results = fs.readdirSync(inputDir).map((name) => {
|
|
const src = fs.readFileSync(path.join(inputDir, name), "utf8");
|
|
const start = process.hrtime.bigint();
|
|
let len;
|
|
for (let i = 0; i < iterations; i++) {
|
|
len = new minimize({ plugins }).parse(src).length;
|
|
}
|
|
const elapsed = process.hrtime.bigint() - start;
|
|
return [name, len, iterations, Number(elapsed) / 1_000_000_000];
|
|
});
|
|
console.log(JSON.stringify(results));
|