Files
SnowCatQQ/packages/snowcat-vite/vite-auto-include.js
T
天天的鸟蛋蛋 b9655a5ab1 SnowCat 雪猫底层全源码:NapCat 4.18.28 底座 + SnowLuma 能力移植 + V8 通道适配 9.9.37
26 包 monorepo(TS 全源码):
- snowcat-core: NT 内核 API 封装 + listener(含 9.9.37 六回调适配)+ Packet 发包
- snowcat-onebot: OneBot v11 全动作 + MCP Streamable HTTP 适配器 + 稳定线
- snowcat-webui-frontend/backend: 雪猫控制台(React+HeroUI)
- snowcat-shell: 单文件 bundle 出口(vite inlineDynamicImports)
- snowcat-native: napi2native / MoeHoo / ffmpeg / pty 运行时
- 56 项 SnowLuma 独门动作移植(qzone 全家桶/群相册/装扮/闪照/收藏)
- 工具件: 解包器/启动器/便携制作器/doctor

GitHub 关联已全量指向 DandanLLab/SnowCatQQ
2026-11-12 06:27:36 +08:00

79 lines
2.2 KiB
JavaScript

import path from 'path';
import fs from 'fs';
export function autoIncludeTSPlugin (options) {
// options: { entries: [{ entry: 'napcat.ts', dir: './utils' }, ...] }
const { entries } = options;
let tsFilesMap = {};
return {
name: 'vite-auto-include',
async buildStart () {
tsFilesMap = {};
for (const { entry, dir } of entries) {
if (!tsFilesMap[entry]) {
tsFilesMap[entry] = [];
}
const fullDir = path.resolve(dir);
const allTsFiles = await findTSFiles(fullDir);
const validFiles = [];
allTsFiles.forEach((filePath) => {
try {
const source = fs.readFileSync(filePath, 'utf-8');
if (source && source.trim() !== '') {
validFiles.push(filePath);
} else {
// Skipping empty file: ${filePath}
}
} catch (error) {
console.error(`Error reading file: ${filePath}`, error);
}
});
tsFilesMap[entry].push(...validFiles);
}
},
transform (code, id) {
for (const [entry, tsFiles] of Object.entries(tsFilesMap)) {
const isMatch = id.endsWith(entry) || id.includes(entry);
if (isMatch && tsFiles.length > 0) {
const imports = tsFiles.map(filePath => {
const relativePath = path.relative(path.dirname(id), filePath).replace(/\\/g, '/');
return `import './${relativePath}';`;
}).join('\n');
const transformedCode = imports + '\n' + code;
return {
code: transformedCode,
map: { mappings: '' }, // 空映射即可,VSCode 可以在 TS 上断点
};
}
}
return null;
},
};
}
// 辅助函数:查找所有 .ts 文件
async function findTSFiles (dir) {
const files = [];
const items = await fs.promises.readdir(dir, { withFileTypes: true });
for (const item of items) {
const fullPath = path.join(dir, item.name);
if (item.isDirectory()) {
files.push(...await findTSFiles(fullPath)); // 递归查找子目录
} else if (item.isFile() && fullPath.endsWith('.ts')) {
files.push(fullPath); // 收集 .ts 文件
}
}
return files;
}