60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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,
 | |
| };
 |