Initial commit
[yaffs-website] / node_modules / sequencify / index.js
1 /*jshint node:true */\r
2 \r
3 "use strict";\r
4 \r
5 var sequence = function (tasks, names, results, nest) {\r
6         var i, name, node, e, j;\r
7         nest = nest || [];\r
8         for (i = 0; i < names.length; i++) {\r
9                 name = names[i];\r
10                 // de-dup results\r
11                 if (results.indexOf(name) === -1) {\r
12                         node = tasks[name];\r
13                         if (!node) {\r
14                                 e = new Error('task "'+name+'" is not defined');\r
15                                 e.missingTask = name;\r
16                                 e.taskList = [];\r
17                                 for (j in tasks) {\r
18                                         if (tasks.hasOwnProperty(j)) {\r
19                                                 e.taskList.push(tasks[j].name);\r
20                                         }\r
21                                 }\r
22                                 throw e;\r
23                         }\r
24                         if (nest.indexOf(name) > -1) {\r
25                                 nest.push(name);\r
26                                 e = new Error('Recursive dependencies detected: '+nest.join(' -> '));\r
27                                 e.recursiveTasks = nest;\r
28                                 e.taskList = [];\r
29                                 for (j in tasks) {\r
30                                         if (tasks.hasOwnProperty(j)) {\r
31                                                 e.taskList.push(tasks[j].name);\r
32                                         }\r
33                                 }\r
34                                 throw e;\r
35                         }\r
36                         if (node.dep.length) {\r
37                                 nest.push(name);\r
38                                 sequence(tasks, node.dep, results, nest); // recurse\r
39                                 nest.pop(name);\r
40                         }\r
41                         results.push(name);\r
42                 }\r
43         }\r
44 };\r
45 \r
46 module.exports = sequence;\r