const gulp = require("gulp"); const ts = require("gulp-typescript"); const swc = require("gulp-swc"); const tsProject = ts.createProject("tsconfig.json"); const argv = require("yargs").argv; const rimraf = require("rimraf"); const plumber = require("gulp-plumber"); const sourcemaps = require("gulp-sourcemaps"); const fs = require("fs"); const swcOptions = { jsc: { parser: { syntax: "typescript", tsx: false, decorators: true, dynamicImport: true, }, transform: { react: { runtime: "automatic", }, }, target: "es2022", loose: false, externalHelpers: false, keepClassNames: true, }, module: { type: "es6", strict: true, strictMode: true, lazy: false, noInterop: false, }, sourceMaps: true, minify: false, }; gulp.task( "watch", function () { gulp.watch("./src", gulp.series("default")); gulp.watch("./translations", gulp.series("default")); }, {debounceDelay: 10}, ); // Clean task to delete the dist directory gulp.task("clean", (cb) => { return rimraf.rimraf("dist").then(cb()); }); const exec = require("child_process").exec; // Task to compile TypeScript files using SWC gulp.task("scripts", async () => { if (argv.swc) { return gulp .src("src/**/*.ts") .pipe(sourcemaps.init()) .pipe(plumber()) // Prevent pipe breaking caused by errors .pipe(swc(swcOptions)) .pipe(sourcemaps.write(".")) .pipe(gulp.dest("dist")); } else if (argv.bunswc) { return await new Promise((ret) => { exec("bun swc --strip-leading-paths ./src -s -d ./dist/ -C jsc.target=es2022").on( "exit", function (code) { ret(); }, ); }); } else { console.warn("[WARN] Using TSC compiler, will be slower than SWC"); return gulp .src("src/**/*.ts") .pipe(sourcemaps.init()) .pipe(plumber()) // Prevent pipe breaking caused by errors .pipe(tsProject()) .pipe(sourcemaps.write(".")) .pipe(gulp.dest("dist")); } }); // Task to copy HTML files gulp.task("copy-html", () => { return gulp .src("src/**/*.html") .pipe(plumber()) // Prevent pipe breaking caused by errors .pipe(gulp.dest("dist")); }); gulp.task("copy-translations", () => { let langs = fs.readdirSync("translations"); langs = langs.filter((e) => e !== "qqq.json"); const langobj = {}; for (const lang of langs) { const json = JSON.parse(fs.readFileSync("translations/" + lang).toString()); langobj[lang] = json.readableName; } if (!fs.existsSync("dist/webpage/translations")) fs.mkdirSync("dist/webpage/translations"); fs.writeFileSync( "dist/webpage/translations/langs.js", `const langs=${JSON.stringify(langobj)};export{langs}`, ); return gulp .src("translations/*.json") .pipe(plumber()) // Prevent pipe breaking caused by errors .pipe(gulp.dest("dist/webpage/translations")); }); // Task to copy other static assets (e.g., CSS, images) gulp.task("copy-assets", () => { return gulp .src( [ "src/**/*.css", "src/**/*.bin", "src/**/*.ico", "src/**/*.json", "src/**/*.js", "src/**/*.png", "src/**/*.jpg", "src/**/*.jpeg", "src/**/*.webp", "src/**/*.gif", "src/**/*.svg", "src/**/*.jasf", "src/**/*.txt", ], {encoding: false}, ) .pipe(plumber()) // Prevent pipe breaking caused by errors .pipe(gulp.dest("dist")); }); // Default task to run all tasks gulp.task( "default", gulp.series("clean", gulp.parallel("scripts", "copy-html", "copy-assets"), "copy-translations"), );