mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-04 06:31:13 +00:00
Introduces a plugin router registry for registering plugin-specific API routes, static resources, and extension pages. Updates the plugin manager and context to expose the router, and implements backend and frontend support for serving and displaying plugin extension pages in the WebUI. Also adds a demo extension page and static resource to the builtin plugin.
107 lines
3.1 KiB
TypeScript
107 lines
3.1 KiB
TypeScript
import { defineConfig } from 'vite';
|
|
import { resolve } from 'path';
|
|
import nodeResolve from '@rollup/plugin-node-resolve';
|
|
import { builtinModules } from 'module';
|
|
import fs from 'fs';
|
|
|
|
const nodeModules = [...builtinModules, builtinModules.map((m) => `node:${m}`)].flat();
|
|
// 依赖排除
|
|
const external = [];
|
|
// 构建后拷贝插件
|
|
function copyToShellPlugin () {
|
|
return {
|
|
name: 'copy-to-shell',
|
|
writeBundle () {
|
|
try {
|
|
const sourceDir = resolve(__dirname, 'dist');
|
|
const targetDir = resolve(__dirname, '../napcat-shell/dist/plugins/napcat-plugin-builtin');
|
|
const packageJsonSource = resolve(__dirname, 'package.json');
|
|
const webuiSourceDir = resolve(__dirname, 'webui');
|
|
const webuiTargetDir = resolve(targetDir, 'webui');
|
|
|
|
// 确保目标目录存在
|
|
if (!fs.existsSync(targetDir)) {
|
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
console.log(`[copy-to-shell] Created directory: ${targetDir}`);
|
|
}
|
|
|
|
// 拷贝 dist 目录下的所有文件
|
|
const files = fs.readdirSync(sourceDir);
|
|
let copiedCount = 0;
|
|
|
|
files.forEach(file => {
|
|
const sourcePath = resolve(sourceDir, file);
|
|
const targetPath = resolve(targetDir, file);
|
|
|
|
if (fs.statSync(sourcePath).isFile()) {
|
|
fs.copyFileSync(sourcePath, targetPath);
|
|
copiedCount++;
|
|
}
|
|
});
|
|
|
|
// 拷贝 package.json
|
|
if (fs.existsSync(packageJsonSource)) {
|
|
const packageJsonTarget = resolve(targetDir, 'package.json');
|
|
fs.copyFileSync(packageJsonSource, packageJsonTarget);
|
|
copiedCount++;
|
|
}
|
|
|
|
// 拷贝 webui 目录
|
|
if (fs.existsSync(webuiSourceDir)) {
|
|
copyDirRecursive(webuiSourceDir, webuiTargetDir);
|
|
console.log(`[copy-to-shell] Copied webui directory to ${webuiTargetDir}`);
|
|
}
|
|
|
|
console.log(`[copy-to-shell] Successfully copied ${copiedCount} file(s) to ${targetDir}`);
|
|
} catch (error) {
|
|
console.error('[copy-to-shell] Failed to copy files:', error);
|
|
throw error;
|
|
}
|
|
},
|
|
};
|
|
}
|
|
|
|
// 递归复制目录
|
|
function copyDirRecursive (src: string, dest: string) {
|
|
if (!fs.existsSync(dest)) {
|
|
fs.mkdirSync(dest, { recursive: true });
|
|
}
|
|
|
|
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
|
|
for (const entry of entries) {
|
|
const srcPath = resolve(src, entry.name);
|
|
const destPath = resolve(dest, entry.name);
|
|
|
|
if (entry.isDirectory()) {
|
|
copyDirRecursive(srcPath, destPath);
|
|
} else {
|
|
fs.copyFileSync(srcPath, destPath);
|
|
}
|
|
}
|
|
}
|
|
|
|
export default defineConfig({
|
|
resolve: {
|
|
conditions: ['node', 'default'],
|
|
alias: {
|
|
'@/napcat-core': resolve(__dirname, '../napcat-core'),
|
|
'@': resolve(__dirname, '../'),
|
|
},
|
|
},
|
|
build: {
|
|
sourcemap: false,
|
|
target: 'esnext',
|
|
minify: false,
|
|
lib: {
|
|
entry: 'index.ts',
|
|
formats: ['es'],
|
|
fileName: () => 'index.mjs',
|
|
},
|
|
rollupOptions: {
|
|
external: [...nodeModules, ...external],
|
|
},
|
|
},
|
|
plugins: [nodeResolve(), copyToShellPlugin()],
|
|
});
|