import { build } from 'esbuild'; import { spawn } from 'node:child_process'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import fs from 'node:fs'; import http from 'node:http'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const root = path.resolve(__dirname, '..'); const DEV_URL = 'http://127.0.0.1:5174/'; async function buildMain() { await build({ entryPoints: [path.join(root, 'app/main/index.ts')], bundle: true, platform: 'node', format: 'cjs', outfile: path.join(root, 'dist/main/index.cjs'), external: ['electron'], sourcemap: true, }); await build({ entryPoints: [path.join(root, 'app/preload/index.ts')], bundle: true, platform: 'node', format: 'cjs', outfile: path.join(root, 'dist/preload/index.cjs'), external: ['electron'], sourcemap: true, }); } function electronPath() { const name = process.platform === 'win32' ? 'electron.cmd' : 'electron'; const bin = path.join(root, 'node_modules', '.bin', name); if (fs.existsSync(bin)) return bin; return path.join(root, 'node_modules', 'electron', 'cli.js'); } function waitForUrl(url, timeoutMs = 60000) { const start = Date.now(); return new Promise((resolve, reject) => { const tick = () => { const req = http.get(url, (res) => { res.resume(); resolve(true); }); req.on('error', () => { if (Date.now() - start > timeoutMs) { reject(new Error(`Timed out waiting for ${url}`)); return; } setTimeout(tick, 250); }); }; tick(); }); } await buildMain(); const vite = spawn( process.platform === 'win32' ? 'npx.cmd' : 'npx', ['vite', '--config', 'vite.config.ts', '--host', '127.0.0.1', '--port', '5174'], { cwd: root, stdio: 'inherit', shell: true }, ); console.log('Waiting for Vite…'); await waitForUrl(DEV_URL); console.log('Vite is ready, launching Electron…'); const elec = spawn(electronPath(), ['.'], { cwd: root, stdio: 'inherit', shell: true, env: { ...process.env, VITE_DEV_SERVER_URL: DEV_URL }, }); elec.on('exit', (code) => { vite.kill(); process.exit(code ?? 0); }); vite.on('exit', (code) => { if (code && code !== 0) { console.error('Vite exited with code', code); elec.kill(); process.exit(code); } });