import { spawn } from 'child_process'
import epilog from '../../lib/epilog.js'
import getCwdPkg from '../../lib/get-cwd-pkg.js'
import boot from 'bajo/boot/index.js'
import { has } from 'lodash-es'
import ora from 'ora'
import { __ } from '../../lib/translate.js'
import util from 'util'
import _terminate from 'terminate'
import { applet, globalScope, posArgs, posName } from '../../lib/option.js'
const terminate = util.promisify(_terminate)
/**
* Command definition object for running a named application.
*
* @memberof module:CLI/Command/App
* @type {TCommand}
*/
const run = {
command: __('%s <%s> [%s...]', 'run', 'name', 'args'),
aliases: ['r'],
describe: __('Run named app'),
builder (yargs) {
posName(yargs, 'App name')
posArgs(yargs)
globalScope(yargs)
applet(yargs)
spawn(yargs)
yargs.epilog(epilog)
},
async handler (argv) {
const { cwd, pkg } = await getCwdPkg({ argv, type: 'main' })
if (has(argv, 'tool')) argv.spawn = false
if (argv.spawn) {
const params = process.argv.slice(process.argv[2] === 'run' ? 4 : 5)
params.unshift(`--spawn=${argv.spawn}`)
params.unshift(`${cwd}/${pkg.main}`)
params.push(`--cwd=${cwd}`)
const spinner = ora(__('Spawning %s...', pkg.name)).start()
const child = spawn('node', params)
spinner.succeed(__('\'%s\' spawned, pid: %s', pkg.name, child.pid))
child.stdout.on('data', d => {
process.stdout.write(d.toString())
})
child.stderr.on('data', d => {
process.stdout.write(d.toString())
})
for (const s of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
process.on(s, async () => {
let text = __('%s terminated', pkg.name)
try {
await terminate(child.pid, s)
} catch (err) {
text += ` with error: ${err.message}`
}
ora(text).succeed()
})
}
} else {
process.argv = process.argv.slice(process.argv[2] === 'run' ? 2 : 3)
await boot(cwd)
}
}
}
export default run