mirror of
https://github.com/YMFE/yapi.git
synced 2024-12-21 05:19:42 +08:00
125 lines
3.8 KiB
JavaScript
Executable File
125 lines
3.8 KiB
JavaScript
Executable File
const yapi = require('./yapi.js');
|
||
const plugin_path = yapi.path.join(yapi.WEBROOT, 'plugins');
|
||
const plugin_system_path = yapi.path.join(yapi.WEBROOT, 'exts');
|
||
const initPlugins = require('../common/lib.js').initPlugins;
|
||
var extConfig = require('../common/config.js').exts;
|
||
var hooks = {
|
||
//第三方sso登录钩子,暂只支持设置一个
|
||
'third_login': {
|
||
type: 'single',
|
||
listener: null
|
||
},
|
||
//增加接口成功后触发
|
||
'interface_add': {
|
||
type: 'multi',
|
||
listener: []
|
||
},
|
||
//删除接口成功后触发
|
||
'interface_del': {
|
||
type: 'multi',
|
||
listener: []
|
||
},
|
||
'project_add':{
|
||
type: 'multi',
|
||
listener: []
|
||
},
|
||
'project_del':{
|
||
type: 'multi',
|
||
listener: []
|
||
},
|
||
//MockServer生成mock数据后触发
|
||
mock_after: {
|
||
type: 'multi',
|
||
listener: []
|
||
},
|
||
//增加路由的钩子
|
||
add_router: {
|
||
type: 'multi',
|
||
listener: []
|
||
}
|
||
};
|
||
|
||
function bindHook(name, listener) {
|
||
if (!name) throw new Error('缺少hookname');
|
||
if (name in hooks === false) {
|
||
throw new Error('不存在的hookname');
|
||
}
|
||
if (hooks[name].type === 'multi') {
|
||
hooks[name].listener.push(listener);
|
||
} else {
|
||
if (typeof hooks[name].listener === 'function') {
|
||
throw new Error('重复绑定singleHook(' + name + '), 请检查');
|
||
}
|
||
hooks[name].listener = listener;
|
||
}
|
||
|
||
}
|
||
|
||
async function emitHook(name) {
|
||
if (hooks[name] && typeof hooks[name] === 'object') {
|
||
let args = Array.prototype.slice.call(arguments, 1);
|
||
if (hooks[name].type === 'single' && typeof hooks[name].listener === 'function') {
|
||
return await hooks[name].listener.apply(yapi, args);
|
||
}
|
||
if (Array.isArray(hooks[name].listener)) {
|
||
let listenerList = hooks[name].listener;
|
||
for(let i=0, l = listenerList.length; i< l; i++){
|
||
await listenerList[i].apply(yapi, args);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
function emitHookSync(name) {
|
||
if (hooks[name] && typeof hooks[name] === 'object') {
|
||
let args = Array.prototype.slice.call(arguments, 1);
|
||
if (hooks[name].type === 'single' && typeof hooks[name].listener === 'function') {
|
||
return hooks[name].listener.apply(yapi, args);
|
||
}
|
||
if (Array.isArray(hooks[name].listener)) {
|
||
hooks[name].listener.forEach((listener) => {
|
||
listener.apply(yapi, args)
|
||
})
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
yapi.bindHook = bindHook;
|
||
yapi.emitHook = emitHook;
|
||
yapi.emitHookSync = emitHookSync;
|
||
|
||
|
||
|
||
let pluginsConfig = initPlugins(yapi.WEBCONFIG.plugins);
|
||
|
||
pluginsConfig.forEach(plugin => {
|
||
if (!plugin || plugin.enable === false || plugin.server === false) return null;
|
||
|
||
if (!yapi.commons.fileExist(yapi.path.join(plugin_path, 'yapi-plugin-' + plugin.name + '/server.js'))) {
|
||
console.error(`config.json配置了插件${plugin},但plugins目录没有找到此插件,请安装此插件`);
|
||
process.exit();
|
||
}
|
||
let pluginModule = require(yapi.path.join(plugin_path, 'yapi-plugin-' + plugin.name + '/server.js'));
|
||
pluginModule.call(yapi, plugin)
|
||
})
|
||
|
||
extConfig = initPlugins(extConfig);
|
||
|
||
extConfig.forEach(plugin => {
|
||
if (!plugin || plugin.enable === false || plugin.server === false) return null;
|
||
|
||
if (!yapi.commons.fileExist(yapi.path.join(plugin_system_path, 'yapi-plugin-' + plugin.name + '/server.js'))) {
|
||
console.error(`config.json配置了插件${plugin},但plugins目录没有找到此插件,请安装此插件`);
|
||
process.exit();
|
||
}
|
||
let pluginModule = require(yapi.path.join(plugin_system_path, 'yapi-plugin-' + plugin.name + '/server.js'));
|
||
pluginModule.call(yapi, plugin)
|
||
yapi.commons.log('init plugins success...')
|
||
})
|
||
|
||
//delete bindHook方法,避免误操作
|
||
delete yapi.bindHook
|
||
|
||
|