mirror of
https://github.com/lifegpc/bookdownload.git
synced 2026-06-06 05:38:46 +08:00
76 lines
2.4 KiB
JavaScript
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');
|