| Leo Repp | 58b9f11 | 2021-11-22 11:57:47 +0100 | [diff] [blame^] | 1 | var reorder = require('./lib/reorder'); |
| 2 | var respawn = require('./lib/respawn'); |
| 3 | var remover = require('./lib/remover'); |
| 4 | |
| 5 | var FORBID_RESPAWNING_FLAG = '--no-respawning'; |
| 6 | |
| 7 | module.exports = function(flags, argv, forcedFlags, execute) { |
| 8 | if (!flags) { |
| 9 | throw new Error('You must specify flags to respawn with.'); |
| 10 | } |
| 11 | if (!argv) { |
| 12 | throw new Error('You must specify an argv array.'); |
| 13 | } |
| 14 | |
| 15 | if (typeof forcedFlags === 'function') { |
| 16 | execute = forcedFlags; |
| 17 | forcedFlags = []; |
| 18 | } |
| 19 | |
| 20 | if (typeof forcedFlags === 'string') { |
| 21 | forcedFlags = [forcedFlags]; |
| 22 | } |
| 23 | |
| 24 | if (!Array.isArray(forcedFlags)) { |
| 25 | forcedFlags = []; |
| 26 | } |
| 27 | |
| 28 | var index = argv.indexOf(FORBID_RESPAWNING_FLAG); |
| 29 | if (index >= 0) { |
| 30 | argv = argv.slice(0, index).concat(argv.slice(index + 1)); |
| 31 | argv = remover(flags, argv); |
| 32 | execute(true, process, argv); |
| 33 | return; |
| 34 | } |
| 35 | |
| 36 | var proc = process; |
| 37 | var reordered = reorder(flags, argv); |
| 38 | var ready = JSON.stringify(argv) === JSON.stringify(reordered); |
| 39 | |
| 40 | if (forcedFlags.length) { |
| 41 | reordered = reordered.slice(0, 1) |
| 42 | .concat(forcedFlags) |
| 43 | .concat(reordered.slice(1)); |
| 44 | ready = false; |
| 45 | } |
| 46 | |
| 47 | if (!ready) { |
| 48 | reordered.push(FORBID_RESPAWNING_FLAG); |
| 49 | proc = respawn(reordered); |
| 50 | } |
| 51 | execute(ready, proc, reordered); |
| 52 | }; |