|
1 | 1 | /**** |
2 | 2 | * The MIT License (MIT) |
3 | | - * |
| 3 | + * |
4 | 4 | * Copyright (c) 2015 Gustavo Henke and Aaron Trent |
5 | | - * |
| 5 | + * |
6 | 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
7 | 7 | * of this software and associated documentation files (the "Software"), to deal |
8 | 8 | * in the Software without restriction, including without limitation the rights |
9 | 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
10 | 10 | * copies of the Software, and to permit persons to whom the Software is |
11 | 11 | * furnished to do so, subject to the following conditions: |
12 | | - * |
| 12 | + * |
13 | 13 | * The above copyright notice and this permission notice shall be included in all |
14 | 14 | * copies or substantial portions of the Software. |
15 | | - * |
| 15 | + * |
16 | 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
17 | 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
18 | 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
19 | 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
20 | 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
21 | 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
22 | 22 | * SOFTWARE. |
23 | | - * |
| 23 | + * |
24 | 24 | ****/ |
25 | | -(function( global, factory ) { |
26 | | - if( typeof define === "function" && define.amd ) { |
27 | | - define( "Toposort", ["exports", "module"], factory ); |
28 | | - } else if( typeof exports !== "undefined" && typeof module !== "undefined" ) { |
29 | | - factory( exports, module ); |
| 25 | +(function (global, factory) { |
| 26 | + if (typeof define === "function" && define.amd) { |
| 27 | + define("Toposort", ["exports", "module"], factory); |
| 28 | + } else if (typeof exports !== "undefined" && typeof module !== "undefined") { |
| 29 | + factory(exports, module); |
30 | 30 | } else { |
31 | 31 | var mod = { |
32 | 32 | exports: {} |
33 | 33 | }; |
34 | | - factory( mod.exports, mod ); |
| 34 | + factory(mod.exports, mod); |
35 | 35 | global.Toposort = mod.exports; |
36 | 36 | } |
37 | | -})( this, function( exports, module ) { |
| 37 | +})(this, function (exports, module) { |
38 | 38 | "use strict"; |
39 | 39 |
|
40 | | - function _classCallCheck( instance, Constructor ) { |
41 | | - if( !(instance instanceof Constructor) ) { |
42 | | - throw new TypeError( "Cannot call a class as a function" ); |
43 | | - } |
44 | | - } |
| 40 | + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
45 | 41 |
|
46 | | - var Toposort = (function() { |
| 42 | + var Toposort = (function () { |
47 | 43 | function Toposort() { |
48 | | - _classCallCheck( this, Toposort ); |
| 44 | + _classCallCheck(this, Toposort); |
49 | 45 |
|
50 | 46 | this.edges = []; |
51 | 47 | this.Toposort = Toposort; |
|
60 | 56 | * @returns {Toposort} The Toposort instance |
61 | 57 | */ |
62 | 58 |
|
63 | | - Toposort.prototype.add = function add( item, deps ) { |
64 | | - if( typeof item !== "string" || !item ) { |
65 | | - throw new TypeError( "Dependent name must be given as a not empty string" ); |
| 59 | + Toposort.prototype.add = function add(item, deps) { |
| 60 | + if (typeof item !== "string" || !item) { |
| 61 | + throw new TypeError("Dependent name must be given as a not empty string"); |
66 | 62 | } |
67 | 63 |
|
68 | | - deps = Array.isArray( deps ) ? deps : [deps]; |
| 64 | + deps = Array.isArray(deps) ? deps : [deps]; |
69 | 65 |
|
70 | | - if( deps.length > 0 ) { |
71 | | - for( var _iterator = deps, _isArray = Array.isArray( _iterator ), _i = 0, _iterator = _isArray ? |
72 | | - _iterator : |
73 | | - _iterator[Symbol.iterator](); ; ) { |
| 66 | + if (deps.length > 0) { |
| 67 | + for (var _iterator = deps, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { |
74 | 68 | var _ref; |
75 | 69 |
|
76 | | - if( _isArray ) { |
77 | | - if( _i >= _iterator.length ) { |
78 | | - break; |
79 | | - } |
| 70 | + if (_isArray) { |
| 71 | + if (_i >= _iterator.length) break; |
80 | 72 | _ref = _iterator[_i++]; |
81 | 73 | } else { |
82 | 74 | _i = _iterator.next(); |
83 | | - if( _i.done ) { |
84 | | - break; |
85 | | - } |
| 75 | + if (_i.done) break; |
86 | 76 | _ref = _i.value; |
87 | 77 | } |
88 | 78 |
|
89 | 79 | var dep = _ref; |
90 | 80 |
|
91 | | - if( typeof dep !== "string" || !dep ) { |
92 | | - throw new TypeError( "Dependency name must be given as a not empty string" ); |
| 81 | + if (typeof dep !== "string" || !dep) { |
| 82 | + throw new TypeError("Dependency name must be given as a not empty string"); |
93 | 83 | } |
94 | 84 |
|
95 | | - this.edges.push( [item, dep] ); |
| 85 | + this.edges.push([item, dep]); |
96 | 86 | } |
97 | 87 | } else { |
98 | | - this.edges.push( [item] ); |
| 88 | + this.edges.push([item]); |
99 | 89 | } |
100 | 90 |
|
101 | 91 | return this; |
|
114 | 104 | var nodes = []; |
115 | 105 |
|
116 | 106 | //accumulate unique nodes into a large list |
117 | | - for( var _iterator2 = this.edges, _isArray2 = Array.isArray( _iterator2 ), _i2 = 0, _iterator2 = _isArray2 ? |
118 | | - _iterator2 : |
119 | | - _iterator2[Symbol.iterator](); ; ) { |
| 107 | + for (var _iterator2 = this.edges, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { |
120 | 108 | var _ref2; |
121 | 109 |
|
122 | | - if( _isArray2 ) { |
123 | | - if( _i2 >= _iterator2.length ) { |
124 | | - break; |
125 | | - } |
| 110 | + if (_isArray2) { |
| 111 | + if (_i2 >= _iterator2.length) break; |
126 | 112 | _ref2 = _iterator2[_i2++]; |
127 | 113 | } else { |
128 | 114 | _i2 = _iterator2.next(); |
129 | | - if( _i2.done ) { |
130 | | - break; |
131 | | - } |
| 115 | + if (_i2.done) break; |
132 | 116 | _ref2 = _i2.value; |
133 | 117 | } |
134 | 118 |
|
135 | 119 | var edge = _ref2; |
136 | 120 |
|
137 | | - for( var _iterator3 = edge, _isArray3 = Array.isArray( _iterator3 ), _i3 = 0, _iterator3 = _isArray3 ? |
138 | | - _iterator3 : |
139 | | - _iterator3[Symbol.iterator](); ; ) { |
| 121 | + for (var _iterator3 = edge, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { |
140 | 122 | var _ref3; |
141 | 123 |
|
142 | | - if( _isArray3 ) { |
143 | | - if( _i3 >= _iterator3.length ) { |
144 | | - break; |
145 | | - } |
| 124 | + if (_isArray3) { |
| 125 | + if (_i3 >= _iterator3.length) break; |
146 | 126 | _ref3 = _iterator3[_i3++]; |
147 | 127 | } else { |
148 | 128 | _i3 = _iterator3.next(); |
149 | | - if( _i3.done ) { |
150 | | - break; |
151 | | - } |
| 129 | + if (_i3.done) break; |
152 | 130 | _ref3 = _i3.value; |
153 | 131 | } |
154 | 132 |
|
155 | 133 | var node = _ref3; |
156 | 134 |
|
157 | | - if( nodes.indexOf( node ) === -1 ) { |
158 | | - nodes.push( node ); |
| 135 | + if (nodes.indexOf(node) === -1) { |
| 136 | + nodes.push(node); |
159 | 137 | } |
160 | 138 | } |
161 | 139 | } |
|
164 | 142 | var place = nodes.length; |
165 | 143 |
|
166 | 144 | //initialize the sorted array with the same length as the unique nodes array |
167 | | - var sorted = new Array( nodes.length ); |
| 145 | + var sorted = new Array(nodes.length); |
168 | 146 |
|
169 | 147 | //define a visitor function that recursively traverses dependencies. |
170 | | - var visit = function visit( node, predecessors ) { |
| 148 | + var visit = function visit(node, predecessors) { |
171 | 149 | //check if a node is dependent of itself |
172 | | - if( predecessors.length !== 0 && predecessors.indexOf( node ) !== -1 ) { |
173 | | - throw new Error( "Cyclic dependency found. " + node + " is dependent of itself.\nDependency chain: " |
174 | | - + predecessors.join( " -> " ) + " => " + node ); |
| 150 | + if (predecessors.length !== 0 && predecessors.indexOf(node) !== -1) { |
| 151 | + throw new Error("Cyclic dependency found. " + node + " is dependent of itself.\nDependency chain: " + predecessors.join(" -> ") + " => " + node); |
175 | 152 | } |
176 | 153 |
|
177 | | - var index = nodes.indexOf( node ); |
| 154 | + var index = nodes.indexOf(node); |
178 | 155 |
|
179 | 156 | //if the node still exists, traverse its dependencies |
180 | | - if( index !== -1 ) { |
| 157 | + if (index !== -1) { |
181 | 158 | var copy = false; |
182 | 159 |
|
183 | 160 | //mark the node as false to exclude it from future iterations |
184 | 161 | nodes[index] = false; |
185 | 162 |
|
186 | 163 | //loop through all edges and follow dependencies of the current node |
187 | | - for( var _iterator4 = _this.edges, _isArray4 = Array.isArray( _iterator4 ), _i4 = 0, _iterator4 = _isArray4 ? |
188 | | - _iterator4 : |
189 | | - _iterator4[Symbol.iterator](); ; ) { |
| 164 | + for (var _iterator4 = _this.edges, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { |
190 | 165 | var _ref4; |
191 | 166 |
|
192 | | - if( _isArray4 ) { |
193 | | - if( _i4 >= _iterator4.length ) { |
194 | | - break; |
195 | | - } |
| 167 | + if (_isArray4) { |
| 168 | + if (_i4 >= _iterator4.length) break; |
196 | 169 | _ref4 = _iterator4[_i4++]; |
197 | 170 | } else { |
198 | 171 | _i4 = _iterator4.next(); |
199 | | - if( _i4.done ) { |
200 | | - break; |
201 | | - } |
| 172 | + if (_i4.done) break; |
202 | 173 | _ref4 = _i4.value; |
203 | 174 | } |
204 | 175 |
|
205 | 176 | var edge = _ref4; |
206 | 177 |
|
207 | | - if( edge[0] === node ) { |
| 178 | + if (edge[0] === node) { |
208 | 179 | //lazily create a copy of predecessors with the current node concatenated onto it |
209 | | - copy = copy || predecessors.concat( [node] ); |
| 180 | + copy = copy || predecessors.concat([node]); |
210 | 181 |
|
211 | 182 | //recurse to node dependencies |
212 | | - visit( edge[1], copy ); |
| 183 | + visit(edge[1], copy); |
213 | 184 | } |
214 | 185 | } |
215 | 186 |
|
|
218 | 189 | } |
219 | 190 | }; |
220 | 191 |
|
221 | | - for( var i = 0; i < nodes.length; i++ ) { |
| 192 | + for (var i = 0; i < nodes.length; i++) { |
222 | 193 | var node = nodes[i]; |
223 | 194 |
|
224 | 195 | //ignore nodes that have been excluded |
225 | | - if( node !== false ) { |
| 196 | + if (node !== false) { |
226 | 197 | //mark the node as false to exclude it from future iterations |
227 | 198 | nodes[i] = false; |
228 | 199 |
|
229 | 200 | //loop through all edges and follow dependencies of the current node |
230 | | - for( var _iterator5 = this.edges, _isArray5 = Array.isArray( _iterator5 ), _i5 = 0, _iterator5 = _isArray5 ? |
231 | | - _iterator5 : |
232 | | - _iterator5[Symbol.iterator](); ; ) { |
| 201 | + for (var _iterator5 = this.edges, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { |
233 | 202 | var _ref5; |
234 | 203 |
|
235 | | - if( _isArray5 ) { |
236 | | - if( _i5 >= _iterator5.length ) { |
237 | | - break; |
238 | | - } |
| 204 | + if (_isArray5) { |
| 205 | + if (_i5 >= _iterator5.length) break; |
239 | 206 | _ref5 = _iterator5[_i5++]; |
240 | 207 | } else { |
241 | 208 | _i5 = _iterator5.next(); |
242 | | - if( _i5.done ) { |
243 | | - break; |
244 | | - } |
| 209 | + if (_i5.done) break; |
245 | 210 | _ref5 = _i5.value; |
246 | 211 | } |
247 | 212 |
|
248 | 213 | var edge = _ref5; |
249 | 214 |
|
250 | | - if( edge[0] === node ) { |
| 215 | + if (edge[0] === node) { |
251 | 216 | //recurse to node dependencies |
252 | | - visit( edge[1], [node] ); |
| 217 | + visit(edge[1], [node]); |
253 | 218 | } |
254 | 219 | } |
255 | 220 |
|
|
278 | 243 | })(); |
279 | 244 |
|
280 | 245 | module.exports = Toposort; |
281 | | -} ); |
| 246 | +}); |
0 commit comments