15815213711
2024-08-26 67b8b6731811983447e053d4396b3708c14dfe3c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
'use strict';
 
const debug = require('debug')('ee-core#sequencify');
 
function sequence(tasks, names, results, missing, recursive, nest, optional, parent) {
  names.forEach(function(name) {
    if (results.requires[name]) return;
 
    const node = tasks[name];
 
    if (!node) {
      if (optional === true) return;
      missing.push(name);
    } else if (nest.includes(name)) {
      nest.push(name);
      recursive.push(nest.slice(0));
      nest.pop(name);
    } else if (node.dependencies.length || node.optionalDependencies.length) {
      nest.push(name);
      if (node.dependencies.length) {
        sequence(tasks, node.dependencies, results, missing, recursive, nest, optional, name);
      }
      if (node.optionalDependencies.length) {
        sequence(tasks, node.optionalDependencies, results, missing, recursive, nest, true, name);
      }
      nest.pop(name);
    }
    if (!optional) {
      results.requires[name] = true;
      debug('task: %s is enabled by %s', name, parent);
    }
    if (!results.sequence.includes(name)) {
      results.sequence.push(name);
    }
  });
}
 
// tasks: object with keys as task names
// names: array of task names
module.exports = function(tasks, names) {
  const results = {
    sequence: [],
    requires: {},
  }; // the final sequence
  const missing = []; // missing tasks
  const recursive = []; // recursive task dependencies
 
  sequence(tasks, names, results, missing, recursive, [], false, 'app');
 
  if (missing.length || recursive.length) {
    results.sequence = []; // results are incomplete at best, completely wrong at worst, remove them to avoid confusion
  }
 
  return {
    sequence: results.sequence.filter(item => results.requires[item]),
    missingTasks: missing,
    recursiveDependencies: recursive,
  };
};