1 | 'use strict'
|
2 |
|
3 | const la = require('lazy-ass')
|
4 | const is = require('check-more-types')
|
5 | const spawn = require('cross-spawn')
|
6 |
|
7 | function runCommand (command, extraEnv) {
|
8 | if (is.string(command)) {
|
9 | command = command.split(' ')
|
10 | }
|
11 | la(is.array(command), 'expected command and args array', command)
|
12 | la(command.length > 0, 'missing command, needs at least something', command)
|
13 | la(is.object(extraEnv), 'expected env object', extraEnv)
|
14 |
|
15 | return new Promise(function (resolve, reject) {
|
16 | const customEnv = Object.assign({}, process.env, extraEnv)
|
17 |
|
18 | const spawnOptions = {
|
19 | env: customEnv,
|
20 | stdio: 'inherit'
|
21 | }
|
22 | const prog = command[0]
|
23 | const args = command.slice(1)
|
24 | console.log(`running "${prog}" with extra env keys`,
|
25 | Object.keys(extraEnv))
|
26 |
|
27 | const proc = spawn(prog, args, spawnOptions)
|
28 |
|
29 | proc.on('error', (err) => {
|
30 | console.error('prog error')
|
31 | console.error(err)
|
32 | reject(err)
|
33 | })
|
34 |
|
35 | proc.on('close', (code) => {
|
36 |
|
37 | if (code) {
|
38 | const msg = `${prog} exit code ${code}`
|
39 | console.error(msg)
|
40 | return reject(new Error(msg))
|
41 | }
|
42 | resolve()
|
43 | })
|
44 | })
|
45 | }
|
46 |
|
47 | module.exports = runCommand
|