mirror of
https://github.com/avwo/whistle.git
synced 2026-10-18 06:30:45 +08:00
218 lines
7.4 KiB
JavaScript
218 lines
7.4 KiB
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();
|
|
var PLUGIN_DIR = pluginUtil.PLUGIN_DIR;
|
|
|
|
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 (pluginUtil.compparePlugin(dir, mtime, old)) {
|
|
plugins[name] = {
|
|
[PLUGIN_DIR]: dir,
|
|
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 (pluginUtil.compparePlugin(dir, mtime, old)) {
|
|
plugins[name] = {
|
|
[PLUGIN_DIR]: dir,
|
|
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 obj = plugins[name];
|
|
var account = obj.account;
|
|
var isSys = obj.isSys;
|
|
var isProj = obj.isProj;
|
|
var notUn = obj.notUn;
|
|
var isDev = obj.isDev;
|
|
var dirName = obj.dir;
|
|
var mtime = obj.mtime;
|
|
var dir = obj.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 = {
|
|
[PLUGIN_DIR]: obj[PLUGIN_DIR],
|
|
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;
|
|
};
|