df50b6b680
Co-authored-by: Cursor <cursoragent@cursor.com>
91 lines
2.3 KiB
JavaScript
91 lines
2.3 KiB
JavaScript
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);
|
|
}
|
|
});
|