@@ -12,54 +12,55 @@ const promiseSpawn = (cmd, args, opts = {}, extra = {}) => {
1212 return spawnWithShell ( cmd , args , opts , extra )
1313 }
1414
15- let proc
15+ let resolve , reject
16+ const promise = new Promise ( ( _resolve , _reject ) => {
17+ resolve = _resolve
18+ reject = _reject
19+ } )
1620
17- const p = new Promise ( ( res , rej ) => {
18- proc = spawn ( cmd , args , opts )
21+ // Create error here so we have a more useful stack trace when rejecting
22+ const closeError = new Error ( 'command failed' )
1923
20- const stdout = [ ]
21- const stderr = [ ]
24+ const stdout = [ ]
25+ const stderr = [ ]
2226
23- const reject = er => rej ( Object . assign ( er , {
24- cmd,
25- args,
26- ...stdioResult ( stdout , stderr , opts ) ,
27- ...extra ,
28- } ) )
27+ const getResult = ( result ) => ( {
28+ cmd,
29+ args,
30+ ...result ,
31+ ...stdioResult ( stdout , stderr , opts ) ,
32+ ...extra ,
33+ } )
34+ const rejectWithOpts = ( er , erOpts ) => {
35+ const resultError = getResult ( erOpts )
36+ reject ( Object . assign ( er , resultError ) )
37+ }
2938
30- proc . on ( 'error' , reject )
39+ const proc = spawn ( cmd , args , opts )
40+ promise . stdin = proc . stdin
41+ promise . process = proc
3142
32- if ( proc . stdout ) {
33- proc . stdout . on ( 'data' , c => stdout . push ( c ) ) . on ( 'error' , reject )
34- proc . stdout . on ( 'error' , er => reject ( er ) )
35- }
43+ proc . on ( 'error' , rejectWithOpts )
3644
37- if ( proc . stderr ) {
38- proc . stderr . on ( 'data' , c => stderr . push ( c ) ) . on ( 'error' , reject )
39- proc . stderr . on ( 'error' , er => reject ( er ) )
40- }
45+ if ( proc . stdout ) {
46+ proc . stdout . on ( 'data' , c => stdout . push ( c ) )
47+ proc . stdout . on ( 'error' , rejectWithOpts )
48+ }
4149
42- proc . on ( 'close' , ( code , signal ) => {
43- const result = {
44- cmd,
45- args,
46- code,
47- signal,
48- ...stdioResult ( stdout , stderr , opts ) ,
49- ...extra ,
50- }
50+ if ( proc . stderr ) {
51+ proc . stderr . on ( 'data' , c => stderr . push ( c ) )
52+ proc . stderr . on ( 'error' , rejectWithOpts )
53+ }
5154
52- if ( code || signal ) {
53- rej ( Object . assign ( new Error ( 'command failed' ) , result ) )
54- } else {
55- res ( result )
56- }
57- } )
55+ proc . on ( 'close' , ( code , signal ) => {
56+ if ( code || signal ) {
57+ rejectWithOpts ( closeError , { code , signal } )
58+ } else {
59+ resolve ( getResult ( { code , signal } ) )
60+ }
5861 } )
5962
60- p . stdin = proc . stdin
61- p . process = proc
62- return p
63+ return promise
6364}
6465
6566const spawnWithShell = ( cmd , args , opts , extra ) => {
0 commit comments