Files
bookdownload/build_test.js
2026-03-02 14:29:52 +08:00

76 lines
2.4 KiB
JavaScript

import esbuild from 'esbuild';
import colors from 'colors';
import fs from 'fs';
function displaySize(bytes) {
const units = ['B', 'KiB', 'MiB', 'GiB', 'TiB'];
let i = 0;
while (bytes >= 1024 && i < units.length - 1) {
bytes /= 1024;
i++;
}
return `${bytes.toFixed(2)} ${units[i]}`;
}
/**@param {esbuild.BuildResult} result */
function displayResult(result) {
for (const outfile in result.metafile.outputs) {
const output = result.metafile.outputs[outfile];
let totalInBytes = 0;
for (const input in output.inputs) {
const inp = result.metafile.inputs[input];
totalInBytes += inp.bytes;
}
let inInfo = '';
if (totalInBytes > 0) {
const ratio = (output.bytes / totalInBytes * 100).toFixed(2);
inInfo = ` - Input size: ${colors.green(displaySize(totalInBytes))} (${totalInBytes} B), Ratio: ${colors.yellow(ratio + '%')}`;
}
console.log(`${colors.cyan(outfile)}: ${colors.yellow(displaySize(output.bytes))} (${output.bytes} B)${inInfo}`);
}
}
async function build(name) {
const result = await esbuild.build({
entryPoints: [`src/${name}.ts`],
bundle: true,
minify: true,
outfile: `${name}.cjs`,
platform: 'node',
target: ['node18'],
sourcemap: true,
sourcesContent: false,
metafile: true,
format: 'cjs',
})
displayResult(result);
return result;
}
async function generateTestFile() {
let content = `import { runTests, waitTestsRegistered } from "./test_base";\n`;
content += 'import process from "node:process";\n';
const files = await fs.promises.readdir('src', {recursive: true});
const testLists = [];
for (const file of files) {
if (file.endsWith('.test.ts')) {
const name = file.slice(0, -8).replaceAll(/[./\\]/g, '_');
content += `import ${name} from "./${file.replaceAll(/[\\]/g, '/')}";\n`;
testLists.push(` ${name},`);
}
}
content += `const tests = [\n${testLists.join('\n')}\n];\n`;
content += `async function run() {
await waitTestsRegistered(tests);
const re = await runTests();
if (re.failure > 0) {
process.exit(1);
}
}
run();\n`;
await fs.promises.writeFile('src/test.ts', content);
}
await generateTestFile();
await build('test');