You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/server/scripts/installPlugin.js

73 lines
1.9 KiB
JavaScript

/**
* 安装插件的前端
*/
require('ts-node').register();
const fs = require('fs-extra');
const path = require('path');
const { argv } = require('process');
const execa = require('execa');
const _ = require('lodash');
const containerPath = path.resolve(__dirname, '../plugins');
const publicPath = path.resolve(__dirname, '../public');
const registryPath = path.resolve(publicPath, './registry-be.json');
const list = fs.readdirSync(containerPath);
const dirs = list.filter((item) =>
fs.statSync(path.resolve(containerPath, item)).isDirectory()
);
/**
* 编译插件并添加到 registry 中
*/
async function start() {
if (argv.length === 2) {
console.log(`安装方式: pnpm plugin:install [pluginName]`);
console.log('所有插件:');
dirs.forEach((dir) => {
console.log(`- ${dir}`);
});
return;
}
const [, , ...installPlugins] = argv;
let availableInstallPlugins = [];
if (installPlugins.includes('all')) {
// 安装所有
availableInstallPlugins = [...dirs];
} else {
// 安装部分
availableInstallPlugins = installPlugins.filter((p) => dirs.includes(p));
}
for (const p of availableInstallPlugins) {
console.log('┌ 开始安装:', p);
let manifest = await fs.readJSON(
path.resolve(containerPath, `./${p}/web/plugins/${p}/manifest.json`)
);
if (!manifest) {
console.error('配置加载失败, 跳转安装');
return;
}
// 编译插件文件
await execa('pnpm', ['build:web'], {
cwd: path.resolve(containerPath, p),
stdout: 'inherit',
stderr: 'inherit',
});
// 追加前端配置到registry
const originRegistry =
(await fs.readJSON(registryPath).catch(() => [])) ?? [];
const newRegistry = _.uniqBy([manifest, ...originRegistry], (m) => m.name);
await fs.writeJSON(registryPath, newRegistry);
console.log('└ 安装完毕:', p);
}
}
start();