UNPKG

create-bfe-cttq

Version:

CTTQ大前端脚手架项目

95 lines (91 loc) 3.02 kB
const fs = require("fs"); const path = require("path"); const { red } = require("kolorist") const PluginPrefix = "cli-plugin-"; // 插件前缀 /** * 获取所有插件 */ exports.getAllPlugins = function() { let plugins = []; let pluginsPath = path.join(__dirname, "../../"); fs.readdirSync(pluginsPath, {withFileTypes: true}).forEach((dir) => { if (dir.isDirectory && dir.name.startsWith(PluginPrefix)) { let pluginPath = path.join(pluginsPath, dir.name); plugins.push({ name: dir.name.substring(PluginPrefix.length, dir.name.length), path: pluginPath, }); } }) return plugins; } /** * 排序加载所有插件模块 * @param {*} plugins 插件 * @param {*} module 模块名称 * @returns 排序后的插件对象 */ exports.loadPlugins = function(plugins, module) { // 加载插件 let pluginModules = []; for (const plugin of plugins) { let pluginModule = loadModule(plugin, module); if (pluginModule) { pluginModules.push(pluginModule); } } // 排序插件 let sortedModules = [...pluginModules]; for (const module of pluginModules) { let after = []; if (module.apply && module.apply.after) { if (typeof module.apply.after == "string") { after = [module.apply.after]; } else if (Array.isArray(module.apply.after)) { after = module.apply.after; } else { throw new Error(red(module.moduleName + ": apply.after") + " 请设置为字符串或者字符串数组"); } } if (after.length < 1) { sortedModules.splice(sortedModules.indexOf(module), 1); sortedModules.push(module) continue; } if (after.length == 1 && after.includes("_")) { sortedModules.splice(sortedModules.indexOf(module), 1); sortedModules.splice(0, 0, module); continue; } let waitAfter = []; for (const sortedModule of sortedModules) { if (module == sortedModule) { continue; } if (after.includes(sortedModule.moduleName)) { waitAfter.push(sortedModule.moduleName); } if (waitAfter.toString() == after.toString()) { sortedModules.splice(sortedModules.indexOf(module), 1); sortedModules.splice(sortedModules.indexOf(sortedModule) + 1, 0, module); break; } } } return sortedModules; } /** * 加载功能模块 * @param {*} plugin 插件 * @param {*} moduleName 模块名称 * @returns 插件对象 */ function loadModule(plugin, moduleName) { try { let module = require(path.resolve(plugin.path, moduleName)); module.moduleName = module.moduleName || plugin.name; return module; } catch (error) { return null; } }