| 'use strict'; | |
| 
 | |
| const isWin = process.platform === 'win32'; | |
| 
 | |
| function notFoundError(original, syscall) { | |
|     return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { | |
|         code: 'ENOENT', | |
|         errno: 'ENOENT', | |
|         syscall: `${syscall} ${original.command}`, | |
|         path: original.command, | |
|         spawnargs: original.args, | |
|     }); | |
| } | |
| 
 | |
| function hookChildProcess(cp, parsed) { | |
|     if (!isWin) { | |
|         return; | |
|     } | |
| 
 | |
|     const originalEmit = cp.emit; | |
| 
 | |
|     cp.emit = function (name, arg1) { | |
|         // If emitting "exit" event and exit code is 1, we need to check if | |
|         // the command exists and emit an "error" instead | |
|         // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 | |
|         if (name === 'exit') { | |
|             const err = verifyENOENT(arg1, parsed); | |
| 
 | |
|             if (err) { | |
|                 return originalEmit.call(cp, 'error', err); | |
|             } | |
|         } | |
| 
 | |
|         return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params | |
|     }; | |
| } | |
| 
 | |
| function verifyENOENT(status, parsed) { | |
|     if (isWin && status === 1 && !parsed.file) { | |
|         return notFoundError(parsed.original, 'spawn'); | |
|     } | |
| 
 | |
|     return null; | |
| } | |
| 
 | |
| function verifyENOENTSync(status, parsed) { | |
|     if (isWin && status === 1 && !parsed.file) { | |
|         return notFoundError(parsed.original, 'spawnSync'); | |
|     } | |
| 
 | |
|     return null; | |
| } | |
| 
 | |
| module.exports = { | |
|     hookChildProcess, | |
|     verifyENOENT, | |
|     verifyENOENTSync, | |
|     notFoundError, | |
| };
 |