blob: 15c1c1f604a5a37215d6a5c77464d3cc3d28e74e [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001var reorder = require('./lib/reorder');
2var respawn = require('./lib/respawn');
3var remover = require('./lib/remover');
4
5var FORBID_RESPAWNING_FLAG = '--no-respawning';
6
7module.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};