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, 'spawn'); | ||
|  | 
 | ||
|  |             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, | ||
|  | }; |