import { execSync } from "child_process"; import { build as esbuild } from "esbuild"; import { cpSync, existsSync, rmSync } from "fs"; import { copySync, emptyDirSync, mkdirpSync } from "fs-extra"; import { join } from "path"; export default class BuildHelper { private rootDir: string; projectDir: string; outDir: string; constructor(projectPath: string) { this.rootDir = join(__dirname, ".."); this.projectDir = join(this.rootDir, projectPath); this.outDir = join(this.projectDir, "dist"); emptyDirSync(this.outDir); } copy(projectDirPath: string, outDirPath: string) { let sourcePath: string; if (projectDirPath.startsWith("/")) { sourcePath = join(this.rootDir, projectDirPath.substring(1)); } else { sourcePath = join(this.projectDir, projectDirPath); } if (outDirPath.endsWith("/")) { mkdirpSync(join(outDirPath)); } copySync(sourcePath, join(this.outDir, outDirPath), { dereference: true }); } deleteFromOutput(path: string) { rmSync(join(this.outDir, path), { recursive: true }); } async buildBackend(entryPoints: string[]) { await esbuild({ entryPoints: entryPoints.map(e => join(this.projectDir, e)), tsconfig: join(this.projectDir, "tsconfig.app.json"), platform: "node", bundle: true, outdir: this.outDir, outExtension: { ".js": ".cjs" }, format: "cjs", external: [ "electron", "@electron/remote", "better-sqlite3", "./xhr-sync-worker.js", "vite" ], splitting: false, loader: { ".css": "text", ".ejs": "text" }, define: { "process.env.NODE_ENV": JSON.stringify("production"), }, minify: true }); } triggerBuildAndCopyTo(projectToBuild: string, destPath: string) { const projectDir = join(this.rootDir, projectToBuild); execSync("pnpm build", { cwd: projectDir, stdio: "inherit" }); copySync(join(projectDir, "dist"), join(this.projectDir, "dist", destPath)); } copyNodeModules(nodeModules: string[]) { for (const moduleName of nodeModules) { const sourceDir = tryPath([ join(this.projectDir, "node_modules", moduleName), join(this.rootDir, "node_modules", moduleName) ]); const destDir = join(this.outDir, "node_modules", moduleName); mkdirpSync(destDir); cpSync(sourceDir, destDir, { recursive: true, dereference: true }); } } } function tryPath(paths: string[]) { for (const path of paths) { if (existsSync(path)) { return path; } } console.error("Unable to find any of the paths:", paths); process.exit(1); }