@cisdi/pangu
Version:
develop tool for ui-engine project
118 lines (99 loc) • 2.81 kB
JavaScript
// load env first
require('dotenv').config()
// apply NODE_ENV
process.env.NODE_ENV = 'development'
const program = require('commander')
const { checkBrowsers } = require('react-dev-utils/browsersHelper')
const { choosePort } = require('react-dev-utils/WebpackDevServerUtils')
const signale = require('signale')
const chokidar = require('chokidar')
const { watchPaths } = require('./utils/paths')
const { fork } = require('child_process')
const updateNotifier = require('update-notifier')
const pkg = require('../package.json')
const { argv } = require('yargs')
const checkDeps = require('./utils/check-deps')
const createServerConfig = require('./config/server.config')
// notify for update
updateNotifier({ pkg }).notify()
/**
* Usage
*/
program
.usage('[options]')
.option('-i, --ip [ip]', 'host to use')
.option('-p, --port [port]', 'port to use')
.option('--ts-check', 'check typescript')
.parse(process.argv)
const DEFAULT_PORT = parseInt(program.port || process.env.PORT, 10) || 3000
const HOST = program.ip || process.env.HOST || '0.0.0.0'
const isInteractive = process.stdout.isTTY
checkDeps()
signale.start('Starting the development server...\n')
checkBrowsers(process.cwd(), isInteractive)
.then(async () => {
const { host = HOST, port = DEFAULT_PORT } = createServerConfig(
HOST,
DEFAULT_PORT
)
const selectedPort = await choosePort(host, port)
return {
port: selectedPort,
host,
}
})
.then(({ port, host }) => {
if (!port) {
return null
}
start(port, host)
})
.catch((err) => {
if (err && err.message) {
signale.error(err.message)
}
process.exit(1)
})
function start(port, host) {
const args = ['--port', port, '--host', host]
if (argv.tsCheck) {
args.push('--ts-check')
}
const child = fork(require.resolve('./server/index.js'), args, {
stdio: 'inherit',
})
const fileWatcher = chokidar.watch(watchPaths, {
persistent: true,
ignoreInitial: true,
})
function restart() {
child.removeAllListeners()
child.kill()
fileWatcher.close()
process.stdin.removeAllListeners()
process.removeAllListeners()
start(port, host)
}
fileWatcher.on('all', (event, path) => {
signale.await('Config file changed, restart dev server...')
signale.info(`Changed file: ${path}`)
restart()
})
process.stdin.on('data', (buf) => {
const message = buf.toString('utf8').trim()
if (message === 'rs' || message === 'restart') {
signale.note('Restart development server')
restart()
}
})
child.on('error', (code) => {
process.exit(1)
})
;[('SIGINT', 'SIGTERM')].forEach(function (sig) {
process.on(sig, function () {
child.kill(sig)
process.exit()
})
})
return child
}