anchundan
Version:
108 lines (105 loc) • 3.7 kB
JavaScript
let path = require('path');
let fs = require('fs');
const publiccom = require('anchundan/src/core/publiccom');
const FrameworkType = require('anchundan/src/core/baseStruct/FrameworkType');
const { isJsFile } = require('anchundan/src/core/utils');
const AppPlugins = [];
const ContextPlugins = [];
const pushPlugin = (arr, plugin, app) => {
if(arr.find( item => {
item.name === plugin.name
})){
return;
}
if(arr === AppPlugins){
addAppPlugin(plugin,app);
}
arr.push(plugin);
}
const addAppPlugin = ( pluginType, app) => {
const plugin = pluginType.content;
if(plugin['install']){
console.log(`install ${pluginType.name}`);
plugin['install'].call(null,app);
return;
};
if(typeof plugin == 'object'){
const { config , plugins } = app;
Object.getOwnPropertyNames(plugin).forEach( key =>{
if(typeof plugin[key] === 'function'){
plugin[key] = plugin[key].bind( { ...app, ...plugin });
}
});
app.plugins[pluginType.name] = plugin;
}
else{
app.plugins[pluginType.name] = (...params)=>{
return plugin.call(app,...params);
};
}
}
const initContextPlugins = (app) => {
let { server } = app;
server.use(async (ctx,next)=>{
////此处增加ctx 的插件挂载s
//console.log('挂载context 插件')
ctx.plugins = {'v':'1.0.0'};
ContextPlugins.forEach( pluginType =>{
const {name,content} = pluginType;
if(typeof content == 'object'){
ctx.plugins[name] = {};
Object.getOwnPropertyNames(content).forEach( key =>{
if(typeof content[key] === 'function'){
ctx.plugins[name][key] = content[key].bind({...ctx,...content});
}
});
}
else{
ctx.plugins[name] = (...params)=>{
return content.call(ctx,...params);
};
}
});
await next();
});
}
const setPlugins = (app)=> {
const plugins = publiccom.getTarget('types')[FrameworkType.PLUGIN];
if(!plugins) return;
plugins.forEach((plugin) => {
const {
name,
typePath
} = plugin;
const list = fs.readdirSync(typePath);
if (list){
list.forEach(( item )=>{
let stat = fs.statSync(path.join(typePath, item ));
if(stat.isFile() && isJsFile(item)){
const tpath = path.join(typePath, item );
const pluginModule = require(tpath);
if(!pluginModule) return;
switch(item.split('.')[0]?.toLocaleLowerCase()){
case "application":
plugin.type = FrameworkType.APP_PLUGIIN;
plugin.content = pluginModule;
plugin.typePath = tpath;
pushPlugin(AppPlugins, plugin, app);
break;
case "context":
plugin.type = FrameworkType.CONTEXT_PLUGIN;
plugin.content = pluginModule;
plugin.typePath = tpath;
pushPlugin(ContextPlugins, plugin, app);
break;
default:break;
}
}
});
}
});
};
module.exports = {
setPlugins,
initContextPlugins,
}