Skip to content

Commit 4adcd5f

Browse files
committed
refactor: 进一步拆分VirtualFileSystemPlugin模块,增强可维护性
1 parent 151a4aa commit 4adcd5f

File tree

11 files changed

+536
-417
lines changed

11 files changed

+536
-417
lines changed

docs/challenges/测试热更新.yml

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/plugins/VirtualFileSystemPlugin/challengeProcessor.ts

Lines changed: 0 additions & 205 deletions
This file was deleted.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import * as fs from 'fs';
2+
import * as path from 'path';
3+
import * as YAML from 'yaml';
4+
import { Challenge } from '../../../types/challenge';
5+
import { processChallengeData } from './processor';
6+
7+
/**
8+
* 收集目录下所有YAML文件中的挑战数据
9+
* @param dirPath 目录路径
10+
* @param rootDir 根目录
11+
* @param isBuild 是否为构建模式
12+
* @returns 挑战数据数组
13+
*/
14+
export function collectYAMLChallenges(dirPath: string, rootDir: string, isBuild = false): Challenge[] {
15+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
16+
let challenges: Challenge[] = [];
17+
18+
for (const entry of entries) {
19+
const fullPath = path.join(dirPath, entry.name);
20+
if (entry.isDirectory()) {
21+
challenges = challenges.concat(collectYAMLChallenges(fullPath, rootDir, isBuild));
22+
} else if (entry.isFile() && path.extname(entry.name) === '.yml') {
23+
const yamlChallenges = processYamlFile(fullPath, rootDir, isBuild);
24+
if (yamlChallenges && yamlChallenges.length > 0) {
25+
challenges = challenges.concat(yamlChallenges);
26+
}
27+
}
28+
}
29+
return challenges;
30+
}
31+
32+
/**
33+
* 处理单个YAML文件
34+
* @param filePath 文件路径
35+
* @param rootDir 根目录
36+
* @param isBuild 是否为构建模式
37+
* @returns 挑战数据数组
38+
*/
39+
function processYamlFile(filePath: string, rootDir: string, isBuild = false): Challenge[] {
40+
try {
41+
const content = fs.readFileSync(filePath, 'utf8');
42+
const parsed = YAML.parse(content);
43+
const challenges: Challenge[] = [];
44+
45+
// 计算YAML文件相对于根目录的路径
46+
const yamlRelativePath = path.relative(rootDir, filePath);
47+
48+
// 处理挑战数据
49+
if (parsed.challenges && Array.isArray(parsed.challenges)) {
50+
// 处理多个挑战的数组格式
51+
console.log(`解析包含挑战数组的YAML文件: ${filePath}`);
52+
parsed.challenges.forEach((challenge: any) => {
53+
// 跳过标记为ignored的挑战
54+
if (challenge.ignored === true) {
55+
console.log(`跳过忽略的挑战: ID=${challenge.id || 'unknown'}, 文件: ${yamlRelativePath}`);
56+
return;
57+
}
58+
// 传递YAML文件路径
59+
challenges.push(processChallengeData(challenge, rootDir, isBuild, yamlRelativePath));
60+
});
61+
} else if (parsed.id) {
62+
// 处理单个挑战格式
63+
console.log(`解析单个挑战YAML文件: ${filePath}`);
64+
// 跳过标记为ignored的挑战
65+
if (parsed.ignored !== true) {
66+
challenges.push(processChallengeData(parsed, rootDir, isBuild, yamlRelativePath));
67+
} else {
68+
console.log(`跳过忽略的挑战文件: ${yamlRelativePath}`);
69+
}
70+
} else {
71+
console.warn(`无法识别的YAML格式,没有找到challenges数组或id字段: ${filePath}`);
72+
}
73+
74+
return challenges;
75+
} catch (e: any) {
76+
console.error(`Error processing ${filePath}: ${e.message}`);
77+
return [];
78+
}
79+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './types';
2+
export * from './collector';
3+
export * from './processor';

0 commit comments

Comments
 (0)