whistle
Version:
HTTP, HTTP2, HTTPS, Websocket debugging proxy
153 lines (146 loc) • 4.6 kB
JavaScript
var path = require('path');
var pluginUtil = require('./util');
var mp = require('./module-paths');
var config = require('../config');
var common = require('../util/common');
var CUSTOM_PLUGIN_PATH = config.CUSTOM_PLUGIN_PATH;
var customPluginPaths = config.customPluginPaths || [];
var notUninstallPluginPaths = config.notUninstallPluginPaths || [];
var projectPluginPaths = config.projectPluginPaths || [];
var accountPluginsPath = config.accountPluginsPath || [];
function readPluginRootList(dir, callback) {
var roots = [];
pluginUtil.readDir(dir, function (_, list) {
if (!list || !list.length) {
return callback(roots);
}
var handleCallback = function () {
var orgRoots = [];
roots = roots.filter(function (obj) {
if (!Array.isArray(obj)) {
return obj;
}
orgRoots.push.apply(orgRoots, obj);
});
callback(orgRoots.concat(roots));
};
var count = 0;
list.forEach(function (name, i) {
if (pluginUtil.isWhistleModule(name)) {
roots[i] = {
name: name,
dir: dir
};
} else if (pluginUtil.isOrgModule(name)) {
++count;
pluginUtil.readDir(path.join(dir, name), function (_, list2) {
if (list2 && list2.length) {
var orgList;
list2.forEach(function (pluginName) {
if (pluginUtil.isWhistleModule(pluginName)) {
orgList = orgList || [];
orgList.push({
org: name,
name: pluginName,
dir: dir
});
}
});
roots[i] = orgList;
}
if (--count === 0) {
count = -1;
handleCallback(roots);
}
});
}
});
if (count === 0) {
count = -1;
handleCallback(roots);
}
});
}
function readPluginModules(dir, callback, plugins, isSys) {
if (typeof dir !== 'string') {
return callback(plugins);
}
readPluginRootList(dir, function (list) {
var len = list.length;
if (!len) {
return callback(plugins);
}
list.forEach(function (obj) {
var dir = obj.dir;
var dirName = obj.org ? obj.org + '/' + obj.name : obj.name;
pluginUtil.getSysPath(dir, dirName, isSys, function(root) {
common.getStat(path.join(root, 'package.json'), function (_, stats) {
if (stats && stats.isFile()) {
obj.root = root;
obj.mtime = stats.mtime.getTime();
}
if (--len === 0) {
list.forEach(function (obj) {
var name = pluginUtil.getPluginName(obj.name);
if (obj.root) {
var old = plugins[name];
if (!old || (obj.mtime > old.mtime && obj.root === old.root)) {
plugins[name] = obj;
}
}
});
callback(plugins);
}
});
});
});
});
}
module.exports = function (callback) {
pluginUtil.readDevPlugins(function(plugins) {
var result = {};
var paths = mp.getPaths();
var count = paths.length;
if (!count && !Object.keys(plugins).length) {
return callback(result);
}
var loadPlugins = function (dir, cb) {
var isAccount = accountPluginsPath.indexOf(dir) !== -1;
var account = isAccount ? config.account : undefined;
var isSys = isAccount || CUSTOM_PLUGIN_PATH === dir || customPluginPaths.indexOf(dir) !== -1;
var isProj = projectPluginPaths.indexOf(dir) !== -1;
var notUn = notUninstallPluginPaths.indexOf(dir) !== -1;
readPluginModules(dir, function () {
Object.keys(plugins).forEach(function (name) {
if (pluginUtil.excludePlugin(name)) {
return;
}
var old = result[name + ':'];
var obj = plugins[name];
if (!old || (obj.mtime > old.mtime && obj.root === old.path)) {
result[name + ':'] = {
account: account,
dir: config.whistleName,
isSys: isSys,
isProj: isProj || obj.isProj,
notUn: notUn,
isDev: obj.isDev,
path: obj.root,
mtime: obj.mtime
};
}
});
cb();
}, plugins, isSys);
};
var index = 0;
var callbackHandler = function () {
var dir = paths[++index];
if (dir) {
return loadPlugins(dir, callbackHandler);
}
callback(result);
};
loadPlugins(paths[index], callbackHandler);
});
};