FreeTube/_scripts/dev-runner.js

189 lines
4.3 KiB
JavaScript
Raw Normal View History

2020-02-16 19:30:00 +01:00
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 ProcessLocalesPlugin = require('./ProcessLocalesPlugin')
2020-02-16 19:30:00 +01:00
let electronProcess = null
let manualRestart = null
const remoteDebugging = process.argv.indexOf('--remote-debug') !== -1
const web = process.argv.indexOf('--web') !== -1
2020-02-16 19:30:00 +01:00
let mainConfig
let rendererConfig
let webConfig
if (!web) {
mainConfig = require('./webpack.main.config')
rendererConfig = require('./webpack.renderer.config')
} else {
webConfig = require('./webpack.web.config')
}
2020-02-16 19:30:00 +01:00
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
2020-02-16 19:30:00 +01:00
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
2020-02-16 19:30:00 +01:00
remoteDebugging ? '--inspect=9222' : '',
remoteDebugging ? '--remote-debugging-port=9223' : ''
],
// { stdio: 'inherit' } // required for logs to actually appear in the stdout
)
2020-02-16 19:30:00 +01:00
electronProcess.on('exit', (code, _) => {
if (code === relaunchExitCode) {
electronProcess = null
restartElectron()
return
}
2020-02-16 19:30:00 +01:00
if (!manualRestart) process.exit(0)
})
}
/**
* @param {import('webpack').Compiler} compiler
* @param {WebpackDevServer} devServer
*/
function setupNotifyLocaleUpdate(compiler, devServer) {
const notifyLocaleChange = (updatedLocales) => {
devServer.sendMessage(devServer.webSocketServer.clients, "freetube-locale-update", updatedLocales)
}
compiler.options.plugins
.filter(plugin => plugin instanceof ProcessLocalesPlugin)
.forEach((/** @type {ProcessLocalesPlugin} */plugin) => {
plugin.notifyLocaleChange = notifyLocaleChange
})
}
2020-02-16 19:30:00 +01:00
function startMain() {
2022-11-06 09:17:33 +01:00
const compiler = webpack(mainConfig)
const { name } = compiler
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...`)
2020-02-16 19:30:00 +01:00
})
2022-11-06 09:17:33 +01:00
compiler.watch({
2020-02-16 19:30:00 +01:00
aggregateTimeout: 500,
},
2022-11-06 09:17:33 +01:00
err => {
if (err) console.error(err)
})
2020-02-16 19:30:00 +01:00
}
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({
static: {
2024-04-18 03:09:29 +02:00
directory: path.resolve(__dirname, '..', 'static'),
watch: {
ignored: [
/(dashFiles|storyboards)\/*/,
'/**/.DS_Store',
'**/static/locales/*'
]
2024-04-18 03:09:29 +02:00
},
publicPath: '/static'
},
port
}, compiler)
2020-02-16 19:30:00 +01:00
server.startCallback(err => {
2020-02-16 19:30:00 +01:00
if (err) console.error(err)
setupNotifyLocaleUpdate(compiler, server)
2020-02-16 19:30:00 +01:00
callback()
})
}
function startWeb () {
const compiler = webpack(webConfig)
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({
open: true,
static: {
directory: path.resolve(__dirname, '..', 'static'),
watch: {
ignored: [
/(dashFiles|storyboards)\/*/,
'/**/.DS_Store',
'**/static/locales/*'
]
}
},
port
}, compiler)
server.startCallback(err => {
if (err) console.error(err)
setupNotifyLocaleUpdate(compiler, server)
})
}
if (!web) {
startRenderer(startMain)
} else {
startWeb()
}