mirror of
https://github.com/FreeTubeApp/FreeTube
synced 2024-11-22 18:07:13 +01:00
61820b1bcf
* Stop using deprecated additionalAssets hook * Watch locale files without webpack-watch-external-files-plugin * Use Maps instead of objects * Use webpack's file timestamps instead of checking the files ourselves * Add hot reloading * Inject hot reload code snippet
189 lines
4.3 KiB
JavaScript
189 lines
4.3 KiB
JavaScript
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')
|
|
|
|
let electronProcess = null
|
|
let manualRestart = null
|
|
|
|
const remoteDebugging = process.argv.indexOf('--remote-debug') !== -1
|
|
const web = process.argv.indexOf('--web') !== -1
|
|
|
|
let mainConfig
|
|
let rendererConfig
|
|
let webConfig
|
|
|
|
if (!web) {
|
|
mainConfig = require('./webpack.main.config')
|
|
rendererConfig = require('./webpack.renderer.config')
|
|
} else {
|
|
webConfig = require('./webpack.web.config')
|
|
}
|
|
|
|
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' : ''
|
|
],
|
|
// { stdio: 'inherit' } // required for logs to actually appear in the stdout
|
|
)
|
|
|
|
electronProcess.on('exit', (code, _) => {
|
|
if (code === relaunchExitCode) {
|
|
electronProcess = null
|
|
restartElectron()
|
|
return
|
|
}
|
|
|
|
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
|
|
})
|
|
}
|
|
|
|
function startMain() {
|
|
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...`)
|
|
})
|
|
|
|
compiler.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({
|
|
static: {
|
|
directory: path.resolve(__dirname, '..', 'static'),
|
|
watch: {
|
|
ignored: [
|
|
/(dashFiles|storyboards)\/*/,
|
|
'/**/.DS_Store',
|
|
'**/static/locales/*'
|
|
]
|
|
},
|
|
publicPath: '/static'
|
|
},
|
|
port
|
|
}, compiler)
|
|
|
|
server.startCallback(err => {
|
|
if (err) console.error(err)
|
|
|
|
setupNotifyLocaleUpdate(compiler, server)
|
|
|
|
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()
|
|
}
|