-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
95 lines (79 loc) · 2.49 KB
/
index.js
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
* @file index
* @author Jim Bulkowski <jim.b@paperelectron.com>
* @project Topological
* @license MIT {@link http://opensource.org/licenses/MIT}
*/
'use strict';
var _ = require('lodash')
/**
*
* @module index
*/
var topo = require('./lib/topo')
/**
* Topological sorting function
*
* @param {Array} edges
* @returns {Array}
*/
module.exports = function magnumTopo(pluginArray){
var Sort = new topo()
var groupedParams = _.chain(pluginArray)
.map(function(plugin) {
// console.log(plugin.paramName, plugin.configName);
if(plugin.paramName){
return {paramName: plugin.paramName, configName: plugin.configName}
}
return false
})
.filter(Boolean)
.groupBy('paramName')
.value()
_.each(pluginArray, function(o) {
// Map dependencies, if there are multiple matching, return the full array
// and flatten at the end of the chain. This Accounts for merge plugins that
// all export the same paramName for use.
var deps = _.isArray(o.depends) ? o.depends : _.isUndefined(o.depends) ? [] : [o.depends]
var pluginsRequiredDependencies = _.chain(deps).map(function(d) {
if(_.isArray(groupedParams[d])){
return _.map(groupedParams[d], function(p){
return p.configName
})
}
return d
}).flatten().value()
// Same as pluginRequiredDependencies.
var opts = _.isArray(o.optional) ? o.optional : _.isUndefined(o.optional) ? [] : [o.optional]
var pluginsOptionalDependencies = _.chain(opts).map(function(d) {
if(_.isArray(groupedParams[d])){
return _.map(groupedParams[d], function(p){
return p.configName
})
}
return d
}).flatten().value()
Sort.add(o.configName, pluginsRequiredDependencies)
Sort.add(o.configName, pluginsOptionalDependencies)
// Automatically add plugins paramName, if it differs from the
// configName of the plugin. this allows downstream plugins to sak for dependencies
// by configName, moduleName, or exported parameter.
if(o.provides) {
var provides = _.isArray(o.provides) ? o.provides : [o.provides]
_.each(provides, function(p) {
if(p !== o.configName){
Sort.add(p, o.configName)
}
})
}
})
var Sorted = Sort.sort().reverse()
var KeyedPlugins = _.keyBy(pluginArray, 'configName')
return _.chain(Sorted)
.map(function(key){
var byPluginName = KeyedPlugins[key]
return byPluginName
})
.filter(_.isObject)
.value()
}