inkstitch/electron/service/commands/dev.js

103 wiersze
3.1 KiB
JavaScript

'use strict'
const loadEnv = require('../utils/loadEnv')
loadEnv()
loadEnv('development')
const chalk = require('chalk')
const webpack = require('webpack')
const WebpackDevServer = require('webpack-dev-server')
const { info } = require('../utils/logger')
const getLocalIP = require('../utils/getLocalIP')
const devWebpackConfig = require('../config/dev')
const devServerOptions = devWebpackConfig.devServer
const { spawn } = require('node:child_process')
const electron = require('electron')
const path = require('path')
const url = require('url')
const fs = require('fs');
let electronProcess = null
let manualRestart = false
// disable warnings in browser console
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'false'
const protocol = devServerOptions.https ? 'https' : 'http'
const host = devServerOptions.host || '0.0.0.0'
const port = devServerOptions.port || 8080
// older code that sets the url for the path I would assume
var parseArg = process.argv[2] || ""
var yarnArg = url.parse(parseArg)
function resetPort() {
let resetData = { "_comment1": "port should not be declared when commiting" }
fs.writeFileSync(path.join(__dirname, "../../src/lib/flaskserverport.json"), JSON.stringify(resetData), 'utf8')
console.log("Resetting the flaskport")
}
function startElectron(webpackport) {
var wbport = webpackport
// this sends url to proper position
process.argv.shift()
process.argv.shift()
// get URL from PrintPDF
// checks if url is http
if (yarnArg.protocol) {
var args = [
'--inspect=5858',
path.join(__dirname, '../../dist/electron/main.js')
].concat(process.argv)
} else {
var args = [
'--inspect=5858',
`http://0.0.0.0:${wbport}/#${process.argv}`
].concat(process.argv)
}
// detect yarn or npm and process commandline args accordingly
if (process.env.npm_execpath.endsWith('yarn.js')) {
args = args.concat(process.argv.slice(3))
} else if (process.env.npm_execpath.endsWith('npm-cli.js')) {
args = args.concat(process.argv.slice(2))
}
electronProcess = spawn(electron, args)
electronProcess.on('close', () => {
if (!manualRestart) {
process.exit()
} else {
process.kill(electronProcess.pid)
}
resetPort()
})
electronProcess.on('exit', () => {
resetPort()
})
}
info('Starting development server...')
const compiler = webpack(devWebpackConfig)
const server = new WebpackDevServer(devServerOptions, compiler)
compiler.hooks.done.tap('serve', (stats) => {
console.log()
console.log()
console.log(`App running at:`)
console.log(` - Local: ${chalk.cyan(`${protocol}://${host}:${port}`)}`)
console.log(` - Network: ${chalk.cyan(`${protocol}://${getLocalIP()}:${port}`)}`)
console.log()
// allows livereload for webpack devserver to work without multiple instances of electron
if (electronProcess) {
manualRestart = true
} else {
manualRestart = false
// starts nodejs electron commandline browser
startElectron(devServerOptions.port)
}
})
server.start(port, host, (err) => {
if (err) {
process.exit(0)
}
})