| '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 (name === 'exit') {
|
| const err = verifyENOENT(arg1, parsed);
|
|
|
| if (err) {
|
| return originalEmit.call(cp, 'error', err);
|
| }
|
| }
|
|
|
| return originalEmit.apply(cp, arguments);
|
| };
|
| }
|
|
|
| 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,
|
| };
|
|
|