create-bfe-cttq
Version:
CTTQ大前端脚手架项目
95 lines (91 loc) • 3.02 kB
JavaScript
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;
}
}