UNPKG

anchundan

Version:
108 lines (105 loc) 3.7 kB
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, }