process.env.NODE_ENV = 'development' const electron = require('electron') const webpack = require('webpack') const WebpackDevServer = require('webpack-dev-server') const kill = require('tree-kill') const path = require('path') const { spawn } = require('child_process') const mainConfig = require('./webpack.main.config') const rendererConfig = require('./webpack.renderer.config') const workersConfig = require('./webpack.workers.config') let electronProcess = null let manualRestart = null const remoteDebugging = !!( process.argv[2] && process.argv[2] === '--remote-debug' ) if (remoteDebugging) { // disable dvtools open in electron process.env.RENDERER_REMOTE_DEBUGGING = true } // Define exit code for relaunch and set it in the environment const relaunchExitCode = 69 process.env.FREETUBE_RELAUNCH_EXIT_CODE = relaunchExitCode const port = 9080 async function killElectron(pid) { return new Promise((resolve, reject) => { if (pid) { kill(pid, err => { if (err) reject(err) resolve() }) } else { resolve() } }) } async function restartElectron() { console.log('\nStarting electron...') const { pid } = electronProcess || {} await killElectron(pid) electronProcess = spawn(electron, [ path.join(__dirname, '../dist/main.js'), // '--enable-logging', Enable to show logs from all electron processes remoteDebugging ? '--inspect=9222' : '', remoteDebugging ? '--remote-debugging-port=9223' : '', ]) electronProcess.on('exit', (code, _) => { if (code === relaunchExitCode) { electronProcess = null restartElectron() return } if (!manualRestart) process.exit(0) }) } function startMain() { const webpackSetup = webpack([mainConfig, workersConfig]) webpackSetup.compilers.forEach(compiler => { const { name } = compiler switch (name) { case 'workers': compiler.hooks.afterEmit.tap('afterEmit', async () => { console.log(`\nCompiled ${name} script!`) console.log(`\nWatching file changes for ${name} script...`) }) break case 'main': default: compiler.hooks.afterEmit.tap('afterEmit', async () => { console.log(`\nCompiled ${name} script!`) manualRestart = true await restartElectron() setTimeout(() => { manualRestart = false }, 2500) console.log(`\nWatching file changes for ${name} script...`) }) break } }) webpackSetup.watch({ aggregateTimeout: 500, }, err => { if (err) console.error(err) }) } function startRenderer(callback) { const compiler = webpack(rendererConfig) const { name } = compiler compiler.hooks.afterEmit.tap('afterEmit', () => { console.log(`\nCompiled ${name} script!`) console.log(`\nWatching file changes for ${name} script...`) }) const server = new WebpackDevServer(compiler, { static: { directory: path.join(process.cwd(), 'static'), watch: { ignored: /(dashFiles|storyboards)\/*/ } }, port }) server.listen(port, '', err => { if (err) console.error(err) callback() }) } startRenderer(startMain)