mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-12-19 05:05:44 +08:00
70 lines
2.3 KiB
JavaScript
70 lines
2.3 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) {
|
||
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] = validFiles;
|
||
}
|
||
},
|
||
|
||
transform(code, id) {
|
||
for (const [entry, tsFiles] of Object.entries(tsFilesMap)) {
|
||
// 检查id是否匹配entry(支持完整路径或相对路径)
|
||
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');
|
||
|
||
return imports + '\n' + code;
|
||
}
|
||
}
|
||
return code;
|
||
},
|
||
};
|
||
}
|
||
|
||
// 辅助函数:查找所有 .ts 文件
|
||
async function findTSFiles(dir) {
|
||
const files = [];
|
||
const items = await fs.promises.readdir(dir, { withFileTypes: true });
|
||
|
||
for (let 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;
|
||
}
|