var reorder = require('./lib/reorder'); var respawn = require('./lib/respawn'); var remover = require('./lib/remover'); var FORBID_RESPAWNING_FLAG = '--no-respawning'; module.exports = function(flags, argv, forcedFlags, execute) { if (!flags) { throw new Error('You must specify flags to respawn with.'); } if (!argv) { throw new Error('You must specify an argv array.'); } if (typeof forcedFlags === 'function') { execute = forcedFlags; forcedFlags = []; } if (typeof forcedFlags === 'string') { forcedFlags = [forcedFlags]; } if (!Array.isArray(forcedFlags)) { forcedFlags = []; } var index = argv.indexOf(FORBID_RESPAWNING_FLAG); if (index >= 0) { argv = argv.slice(0, index).concat(argv.slice(index + 1)); argv = remover(flags, argv); execute(true, process, argv); return; } var proc = process; var reordered = reorder(flags, argv); var ready = JSON.stringify(argv) === JSON.stringify(reordered); if (forcedFlags.length) { reordered = reordered.slice(0, 1) .concat(forcedFlags) .concat(reordered.slice(1)); ready = false; } if (!ready) { reordered.push(FORBID_RESPAWNING_FLAG); proc = respawn(reordered); } execute(ready, proc, reordered); };