| 
									
										
										
										
											2025-09-01 20:29:34 +03:00
										 |  |  | import { execSync } from "child_process"; | 
					
						
							|  |  |  | import { build as esbuild } from "esbuild"; | 
					
						
							| 
									
										
										
										
											2025-09-02 13:59:09 +03:00
										 |  |  | import { cpSync, existsSync, rmSync } from "fs"; | 
					
						
							| 
									
										
										
										
											2025-09-01 19:36:14 +03:00
										 |  |  | import { copySync, emptyDirSync, mkdirpSync } from "fs-extra"; | 
					
						
							|  |  |  | import { join } from "path"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default class BuildHelper { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-01 20:29:34 +03:00
										 |  |  |     private rootDir: string; | 
					
						
							| 
									
										
										
										
											2025-09-01 21:16:10 +03:00
										 |  |  |     projectDir: string; | 
					
						
							|  |  |  |     outDir: string; | 
					
						
							| 
									
										
										
										
											2025-09-01 19:36:14 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     constructor(projectPath: string) { | 
					
						
							| 
									
										
										
										
											2025-09-01 20:29:34 +03:00
										 |  |  |         this.rootDir = join(__dirname, ".."); | 
					
						
							|  |  |  |         this.projectDir = join(this.rootDir, projectPath); | 
					
						
							| 
									
										
										
										
											2025-09-01 19:36:14 +03:00
										 |  |  |         this.outDir = join(this.projectDir, "dist"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         emptyDirSync(this.outDir); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     copy(projectDirPath: string, outDirPath: string) { | 
					
						
							| 
									
										
										
										
											2025-09-01 20:50:22 +03:00
										 |  |  |         let sourcePath: string; | 
					
						
							|  |  |  |         if (projectDirPath.startsWith("/")) { | 
					
						
							|  |  |  |             sourcePath = join(this.rootDir, projectDirPath.substring(1)); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             sourcePath = join(this.projectDir, projectDirPath); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-01 19:36:14 +03:00
										 |  |  |         if (outDirPath.endsWith("/")) { | 
					
						
							|  |  |  |             mkdirpSync(join(outDirPath)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-09-01 20:50:22 +03:00
										 |  |  |         copySync(sourcePath, join(this.outDir, outDirPath), { dereference: true }); | 
					
						
							| 
									
										
										
										
											2025-09-01 19:36:14 +03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deleteFromOutput(path: string) { | 
					
						
							|  |  |  |         rmSync(join(this.outDir, path), { recursive: true }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-01 20:29:34 +03:00
										 |  |  |     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[]) { | 
					
						
							| 
									
										
										
										
											2025-09-02 13:59:09 +03:00
										 |  |  |         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; | 
					
						
							| 
									
										
										
										
											2025-09-01 20:29:34 +03:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-02 13:59:09 +03:00
										 |  |  |     console.error("Unable to find any of the paths:", paths); | 
					
						
							|  |  |  |     process.exit(1); | 
					
						
							| 
									
										
										
										
											2025-09-01 19:36:14 +03:00
										 |  |  | } |