You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.4 KiB
59 lines
1.4 KiB
'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, |
|
};
|
|
|