whistle
Version:
HTTP, HTTP2, HTTPS, Websocket debugging proxy
214 lines (201 loc) • 7.48 kB
JavaScript
var path = require('path');
var fs = require('fs');
var util = require('../util');
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 || [];
var paths = mp.getPaths();
function getMTimeSync(filePath) {
var stats = common.getStatSync(filePath);
return stats &&stats.isFile() ? stats.mtime.getTime() : null;
}
function readPluginModulesSync(dir, plugins) {
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;
try {
var list = fs.readdirSync(dir).filter(function (name) {
if (pluginUtil.isWhistleModule(name)) {
return true;
}
if (pluginUtil.isOrgModule(name)) {
try {
var _dir = path.join(dir, name);
var org = name;
fs.readdirSync(_dir).forEach(function (name) {
if (pluginUtil.isWhistleModule(name)) {
var root = isSys ? pluginUtil.getSysPathSync(_dir, name, org) : path.join(_dir, name);
var mtime = getMTimeSync(path.join(root, 'package.json'));
if (mtime != null) {
var old = plugins[name];
if (!old || (mtime > old.mtime && root === old.root)) {
plugins[name] = {
mtime: mtime,
root: root,
account: account,
dir: config.whistleName,
isSys: isSys,
notUn: notUn,
isProj: isProj
};
}
}
}
});
} catch (e) {}
}
return false;
});
list.forEach(function (name) {
var root = isSys ? pluginUtil.getSysPathSync(dir, name) : path.join(dir, name);
var mtime = getMTimeSync(path.join(root, 'package.json'));
if (mtime != null) {
var old = plugins[name];
if (!old || (mtime > old.mtime && root === old.root)) {
plugins[name] = {
root: root,
mtime: mtime,
account: account,
dir: config.whistleName,
isSys: isSys,
notUn: notUn,
isProj: isProj
};
}
}
});
} catch (e) {}
return plugins;
}
module.exports = function () {
var plugins = pluginUtil.readDevPluginsSync();
paths.forEach(function (dir) {
readPluginModulesSync(dir, plugins);
});
var _plugins = {};
Object.keys(plugins).forEach(function (name) {
var simpleName = pluginUtil.getPluginName(name);
if (pluginUtil.excludePlugin(simpleName)) {
return;
}
var dir = plugins[name];
var account = dir.account;
var isSys = dir.isSys;
var isProj = dir.isProj;
var notUn = dir.notUn;
var isDev = dir.isDev;
var dirName = dir.dir;
var mtime = dir.mtime;
dir = dir.root;
var pkgPath = path.join(dir, 'package.json');
var pkg = common.readJsonSync(pkgPath);
if (!pkg) {
return;
}
if (!pkg.version || !pluginUtil.isPluginName(pkg.name)) {
try {
fs.renameSync(pkgPath, pkgPath + '.' + Date.now());
} catch (e) {}
return;
}
try {
var conf = pkg.whistleConfig || '';
var tabs = util.getInspectorTabs(conf);
var hintList = util.getHintList(conf);
var plugin = {
account: account,
dir: dirName,
isSys: isSys,
isDev: isDev,
isProj: isProj,
noOpt: !!(conf.noOption || conf.notOption || conf.disableOption|| conf.disabledOption),
notUn: notUn,
moduleName: pkg.name,
enableAuthUI: !!conf.enableAuthUI,
inheritAuth: !!conf.inheritAuth,
updateUrl: util.getUpdateUrl(conf),
tunnelKey: util.getTunnelKey(conf),
staticDir: util.getStaticDir(conf),
pluginVars: util.getPluginVarsConf(conf),
networkColumn: util.getNetworkColumn(conf),
webWorker: pluginUtil.readWorkerSync(dir, conf, simpleName),
networkMenus: util.getPluginMenu(
conf.networkMenus || conf.networkMenu,
simpleName
),
rulesMenus: util.getPluginMenu(
conf.rulesMenus || conf.rulesMenu,
simpleName
),
valuesMenus: util.getPluginMenu(
conf.valuesMenus || conf.valuesMenu,
simpleName
),
pluginsMenus: util.getPluginMenu(
conf.pluginsMenus || conf.pluginsMenu,
simpleName
),
reqTab: util.getCustomTab(tabs.req, simpleName),
resTab: util.getCustomTab(tabs.res, simpleName),
tab: util.getCustomTab(tabs, simpleName),
toolTab: util.getCustomTab(conf.toolsTab || conf.toolTab, simpleName),
comTab: util.getCustomTab(conf.composerTab, simpleName),
pluginHomepage: pluginUtil.getPluginHomepage(pkg) || pluginUtil.getPluginHomepage(conf),
openInPlugins: conf.openInPlugins ? 1 : undefined,
openInModal: util.getPluginModal(conf),
openExternal: conf.openExternal ? 1 : undefined,
priority: parseInt(conf.priority, 10) || parseInt(pkg.pluginPriority, 10) || 0,
rulesUrl: util.getCgiUrl(conf.rulesUrl),
valuesUrl: util.getCgiUrl(conf.valuesUrl),
installUrl: util.getCgiUrl(conf.installUrl),
favicon: util.getCgiUrl(conf.favicon),
installRegistry: util.getInstallRegistry(conf.installRegistry),
hintUrl: hintList ? undefined : util.getCgiUrl(conf.hintUrl),
hideShortProtocol: !!conf.hideShortProtocol,
hideLongProtocol: !!conf.hideLongProtocol,
hintList: hintList,
registry: util.getRegistry(pkg),
path: dir,
mtime: mtime,
version: pkg.version,
description: pkg.description,
homepage: pluginUtil.getHomePageFromPackage(pkg) || pluginUtil.getHomePageFromPackage(conf),
rules: util.renderPluginRules(
util.trim(util.readFileSync(path.join(dir, 'rules.txt'))),
pkg,
simpleName
),
_rules: util.renderPluginRules(
util.trim(util.readFileSync(path.join(dir, '_rules.txt'))) ||
util.trim(util.readFileSync(path.join(dir, 'reqRules.txt'))),
pkg,
simpleName
),
resRules: util.renderPluginRules(
util.trim(util.readFileSync(path.join(dir, 'resRules.txt'))),
pkg,
simpleName
)
};
plugin[util.PLUGIN_VALUES] = pluginUtil.parseValues(
util.renderPluginRules(
util.readFileSync(path.join(dir, '_values.txt')),
pkg,
simpleName
), simpleName);
plugin[util.PLUGIN_MENU_CONFIG] = util.getPluginMenuConfig(conf);
plugin[util.PLUGIN_INSPECTOR_CONFIG] =
util.getPluginInspectorConfig(conf);
_plugins[simpleName + ':'] = plugin;
} catch (e) {}
});
return _plugins;
};