| 'use strict'; | 
| const mergePromiseProperty = (spawned, promise, property) => { | 
|     // Starting the main `promise` is deferred to avoid consuming streams | 
|     const value = typeof promise === 'function' ? | 
|         (...args) => promise()[property](...args) : | 
|         promise[property].bind(promise); | 
|   | 
|     Object.defineProperty(spawned, property, { | 
|         value, | 
|         writable: true, | 
|         enumerable: false, | 
|         configurable: true | 
|     }); | 
| }; | 
|   | 
| // The return value is a mixin of `childProcess` and `Promise` | 
| const mergePromise = (spawned, promise) => { | 
|     mergePromiseProperty(spawned, promise, 'then'); | 
|     mergePromiseProperty(spawned, promise, 'catch'); | 
|   | 
|     // TODO: Remove the `if`-guard when targeting Node.js 10 | 
|     if (Promise.prototype.finally) { | 
|         mergePromiseProperty(spawned, promise, 'finally'); | 
|     } | 
|   | 
|     return spawned; | 
| }; | 
|   | 
| // Use promises instead of `child_process` events | 
| const getSpawnedPromise = spawned => { | 
|     return new Promise((resolve, reject) => { | 
|         spawned.on('exit', (exitCode, signal) => { | 
|             resolve({exitCode, signal}); | 
|         }); | 
|   | 
|         spawned.on('error', error => { | 
|             reject(error); | 
|         }); | 
|   | 
|         if (spawned.stdin) { | 
|             spawned.stdin.on('error', error => { | 
|                 reject(error); | 
|             }); | 
|         } | 
|     }); | 
| }; | 
|   | 
| module.exports = { | 
|     mergePromise, | 
|     getSpawnedPromise | 
| }; |