1
0
mirror of https://github.com/zumbiepig/MineXLauncher.git synced 2025-06-07 19:44:47 +00:00
MineXLauncher/build.ts
2024-09-27 16:58:59 -07:00

103 lines
2.7 KiB
TypeScript

import { build } from 'bun';
import {
mkdirSync,
readdirSync,
statSync,
writeFileSync,
readFileSync,
rmSync,
} from 'fs';
import { resolve, dirname } from 'path';
import { minify } from 'html-minifier';
import chalk from 'chalk';
function getFiles(baseDir: string, dir?: string, filesArr?: string[]) {
dir = dir ?? baseDir;
filesArr = filesArr ?? [];
const files = readdirSync(dir);
for (const file of files) {
const name = resolve(dir, file);
if (statSync(name).isDirectory()) {
getFiles(baseDir, name, filesArr);
} else {
filesArr.push(name);
}
}
return filesArr;
}
const srcDir = resolve(import.meta.dir, 'src');
const publicDir = resolve(
import.meta.dir,
process.env['BUILD_PATH'] ?? 'public',
);
const srcFiles = getFiles(resolve(import.meta.dir, 'src'));
const bundleFiles: string[] = [];
const minifyFiles: string[] = [];
const copyFiles: string[] = [];
srcFiles.forEach((file) => {
const strippedPath = file.replace(new RegExp(`^${srcDir}`), '');
if (file.endsWith('.ts')) bundleFiles.push(file);
else if (
/\.(?:html|css|js|json)$/.test(strippedPath) &&
!/^\/game\/.*(?:\/offline\.html|\/classes\.js)$/.test(strippedPath)
)
minifyFiles.push(file);
else copyFiles.push(file);
});
console.log(chalk.cyan('Removing old build artifacts...\n'));
rmSync(publicDir, { force: true, recursive: true });
console.log(chalk.cyan('Bundling TypeScript and modules...\n'));
await build({
entrypoints: srcFiles.filter((file) => file.endsWith('.ts')),
outdir: './public/',
target: 'browser',
root: './src/',
minify: {
syntax: true,
whitespace: true,
identifiers: false,
},
});
console.log(chalk.cyan('Minifying HTML, JS, CSS, and JSON...\n'));
minifyFiles.forEach((file) => {
const outputPath = file.replace(new RegExp(`^${srcDir}`), publicDir);
mkdirSync(dirname(outputPath), { recursive: true });
writeFileSync(
outputPath,
minify(readFileSync(file, 'utf-8'), {
collapseWhitespace: true,
removeComments: true,
minifyCSS: true,
minifyJS: true,
continueOnParseError: true,
}),
);
});
console.log(chalk.cyan('Copying other files...\n'));
copyFiles.forEach((file) => {
const outputPath = file.replace(new RegExp(`^${srcDir}`), publicDir);
mkdirSync(dirname(outputPath), { recursive: true });
writeFileSync(outputPath, readFileSync(file));
});
console.log(chalk.cyan('Generating assets list...\n'));
const assetsJsonPath = resolve(publicDir, 'resources/data/assets.json');
mkdirSync(dirname(assetsJsonPath), { recursive: true });
writeFileSync(
assetsJsonPath,
JSON.stringify(
getFiles(publicDir).map((asset) => {
return asset
.replace(new RegExp(`^${publicDir}`), '')
.replace(/\/index\.html$/, '/');
}),
),
);
console.log(chalk.green('Build complete!\n'));