105 lines
2.9 KiB
JavaScript
105 lines
2.9 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import {build, createServer} from 'vite';
|
|
import electronPath from 'electron';
|
|
import {spawn} from 'child_process';
|
|
|
|
/** @type 'production' | 'development'' */
|
|
const mode = (process.env.MODE = process.env.MODE || 'development');
|
|
|
|
/** @type {import('vite').LogLevel} */
|
|
const logLevel = 'warn';
|
|
|
|
/**
|
|
* Setup watcher for `main` package
|
|
* On file changed it totally re-launch electron app.
|
|
* @param {import('vite').ViteDevServer} watchServer Renderer watch server instance.
|
|
* Needs to set up `VITE_DEV_SERVER_URL` environment variable from {@link import('vite').ViteDevServer.resolvedUrls}
|
|
*/
|
|
function setupMainPackageWatcher({resolvedUrls}) {
|
|
process.env.VITE_DEV_SERVER_URL = resolvedUrls.local[0];
|
|
|
|
/** @type {ChildProcess | null} */
|
|
let electronApp = null;
|
|
|
|
return build({
|
|
mode,
|
|
logLevel,
|
|
configFile: 'packages/main/vite.config.js',
|
|
build: {
|
|
/**
|
|
* Set to {} to enable rollup watcher
|
|
* @see https://vitejs.dev/config/build-options.html#build-watch
|
|
*/
|
|
watch: {},
|
|
},
|
|
plugins: [
|
|
{
|
|
name: 'reload-app-on-main-package-change',
|
|
writeBundle() {
|
|
/** Kill electron if process already exist */
|
|
if (electronApp !== null) {
|
|
electronApp.removeListener('exit', process.exit);
|
|
electronApp.kill('SIGINT');
|
|
electronApp = null;
|
|
}
|
|
|
|
/** Spawn new electron process */
|
|
electronApp = spawn(String(electronPath), ['--inspect', '.'], {
|
|
stdio: 'inherit',
|
|
});
|
|
|
|
/** Stops the watch script when the application has been quit */
|
|
electronApp.addListener('exit', process.exit);
|
|
},
|
|
},
|
|
],
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Setup watcher for `preload` package
|
|
* On file changed it reload web page.
|
|
* @param {import('vite').ViteDevServer} watchServer Renderer watch server instance.
|
|
* Required to access the web socket of the page. By sending the `full-reload` command to the socket, it reloads the web page.
|
|
*/
|
|
function setupPreloadPackageWatcher({ws}) {
|
|
return build({
|
|
mode,
|
|
logLevel,
|
|
configFile: 'packages/preload/vite.config.js',
|
|
build: {
|
|
/**
|
|
* Set to {} to enable rollup watcher
|
|
* @see https://vitejs.dev/config/build-options.html#build-watch
|
|
*/
|
|
watch: {},
|
|
},
|
|
plugins: [
|
|
{
|
|
name: 'reload-page-on-preload-package-change',
|
|
writeBundle() {
|
|
ws.send({
|
|
type: 'full-reload',
|
|
});
|
|
},
|
|
},
|
|
],
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Dev server for Renderer package
|
|
* This must be the first,
|
|
* because the {@link setupMainPackageWatcher} and {@link setupPreloadPackageWatcher}
|
|
* depend on the dev server properties
|
|
*/
|
|
const rendererWatchServer = await createServer({
|
|
mode,
|
|
logLevel,
|
|
configFile: 'packages/renderer/vite.config.js',
|
|
}).then(s => s.listen());
|
|
|
|
await setupPreloadPackageWatcher(rendererWatchServer);
|
|
await setupMainPackageWatcher(rendererWatchServer);
|