1 | const toposort = require('toposort');
|
2 |
|
3 | module.exports = (reverse = false, packages = []) => {
|
4 | const packageNames = new Set(packages.map(pkg => pkg.name));
|
5 |
|
6 | const edges = packages.reduce((accumulator, pkg) => {
|
7 | const localDependencies = pkg.allDependencies.filter(dependency => {
|
8 | return packageNames.has(dependency);
|
9 | });
|
10 |
|
11 | return accumulator.concat(
|
12 | localDependencies.map(dependency => [dependency, pkg.name]),
|
13 | );
|
14 | }, []);
|
15 |
|
16 | const order = toposort.array([...packageNames], edges);
|
17 |
|
18 | if (reverse) {
|
19 | order.reverse();
|
20 | }
|
21 |
|
22 | return order.map(packageName => {
|
23 | return packages.find(pkg => pkg.name === packageName);
|
24 | });
|
25 | };
|