122 lines
3.1 KiB
JavaScript
122 lines
3.1 KiB
JavaScript
process.env.NODE_ENV = 'development';
|
|
|
|
const Vite = require('vite');
|
|
const ChildProcess = require('child_process');
|
|
const Path = require('path');
|
|
const Chalk = require('chalk');
|
|
const Chokidar = require('chokidar');
|
|
const Electron = require('electron');
|
|
const compileTs = require('./private/tsc');
|
|
const FileSystem = require('fs');
|
|
const { EOL } = require('os');
|
|
|
|
let viteServer = null;
|
|
let electronProcess = null;
|
|
let electronProcessLocker = false;
|
|
let rendererPort = 0;
|
|
|
|
async function startRenderer() {
|
|
viteServer = await Vite.createServer({
|
|
configFile: Path.join(__dirname, '..', 'vite.config.js'),
|
|
mode: 'development',
|
|
});
|
|
|
|
return viteServer.listen();
|
|
}
|
|
|
|
async function startElectron() {
|
|
if (electronProcess) { // single instance lock
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await compileTs(Path.join(__dirname, '..', 'src', 'main'));
|
|
} catch {
|
|
console.log(Chalk.redBright('Could not start Electron because of the above typescript error(s).'));
|
|
electronProcessLocker = false;
|
|
return;
|
|
}
|
|
|
|
const args = [
|
|
Path.join(__dirname, '..', 'build', 'main', 'main.js'),
|
|
rendererPort,
|
|
];
|
|
electronProcess = ChildProcess.spawn(Electron, args);
|
|
electronProcessLocker = false;
|
|
|
|
electronProcess.stdout.on('data', data => {
|
|
if (data == EOL) {
|
|
return;
|
|
}
|
|
|
|
process.stdout.write(Chalk.blueBright(`[electron] `) + Chalk.white(data.toString()))
|
|
});
|
|
|
|
electronProcess.stderr.on('data', data =>
|
|
process.stderr.write(Chalk.blueBright(`[electron] `) + Chalk.white(data.toString()))
|
|
);
|
|
|
|
electronProcess.on('exit', () => stop());
|
|
}
|
|
|
|
function restartElectron() {
|
|
if (electronProcess) {
|
|
electronProcess.removeAllListeners('exit');
|
|
electronProcess.kill();
|
|
electronProcess = null;
|
|
}
|
|
|
|
if (!electronProcessLocker) {
|
|
electronProcessLocker = true;
|
|
startElectron();
|
|
}
|
|
}
|
|
|
|
function copyStaticFiles() {
|
|
copy('static');
|
|
}
|
|
|
|
/*
|
|
The working dir of Electron is build/main instead of src/main because of TS.
|
|
tsc does not copy static files, so copy them over manually for dev server.
|
|
*/
|
|
function copy(path) {
|
|
FileSystem.cpSync(
|
|
Path.join(__dirname, '..', 'src', 'main', path),
|
|
Path.join(__dirname, '..', 'build', 'main', path),
|
|
{ recursive: true }
|
|
);
|
|
}
|
|
|
|
function stop() {
|
|
viteServer.close();
|
|
process.exit();
|
|
}
|
|
|
|
async function start() {
|
|
console.log(`${Chalk.greenBright('=======================================')}`);
|
|
console.log(`${Chalk.greenBright('Starting Electron + Vite Dev Server...')}`);
|
|
console.log(`${Chalk.greenBright('=======================================')}`);
|
|
|
|
const devServer = await startRenderer();
|
|
rendererPort = devServer.config.server.port;
|
|
|
|
copyStaticFiles();
|
|
startElectron();
|
|
|
|
const path = Path.join(__dirname, '..', 'src', 'main');
|
|
Chokidar.watch(path, {
|
|
cwd: path,
|
|
}).on('change', (path) => {
|
|
console.log(Chalk.blueBright(`[electron] `) + `Change in ${path}. reloading... 🚀`);
|
|
|
|
if (path.startsWith(Path.join('static', '/'))) {
|
|
copy(path);
|
|
}
|
|
|
|
restartElectron();
|
|
});
|
|
}
|
|
|
|
start();
|