figma-restoration-mcp-vue-tools
Version:
Professional Figma Component Restoration Kit - MCP tools with snapDOM-powered high-quality screenshots, intelligent shadow detection, and advanced diff analysis for Vue component restoration. Features enhanced figma_compare with color-coded region analysi
339 lines (281 loc) • 8.91 kB
JavaScript
/**
* 最终验证脚本
* 验证重构后的项目完整性和功能
*/
import fs from 'fs';
import path from 'path';
const validationResults = {
timestamp: new Date().toISOString(),
version: '4.1.0',
checks: {},
summary: {}
};
/**
* 检查目录结构完整性
*/
function checkDirectoryStructure() {
console.log('🏗️ 检查目录结构完整性...');
const expectedDirs = [
'src/core/analyzers',
'src/core/comparators',
'src/core/processors',
'src/ui/pages',
'src/ui/layouts',
'src/ui/common',
'src/types',
'src/tools',
'src/services',
'src/utils',
'scripts/build',
'scripts/deploy',
'scripts/setup',
'tests/unit',
'tests/integration',
'tests/fixtures'
];
const results = {
total: expectedDirs.length,
found: 0,
missing: [],
valid: []
};
for (const dir of expectedDirs) {
if (fs.existsSync(dir)) {
results.found++;
results.valid.push(dir);
} else {
results.missing.push(dir);
}
}
results.successRate = (results.found / results.total) * 100;
console.log(`✅ 找到 ${results.found}/${results.total} 个目录`);
console.log(` 成功率: ${results.successRate.toFixed(1)}%`);
if (results.missing.length > 0) {
console.log(`❌ 缺失目录: ${results.missing.join(', ')}`);
}
return results;
}
/**
* 检查核心文件完整性
*/
function checkCoreFiles() {
console.log('\n📦 检查核心文件完整性...');
const expectedFiles = [
'src/core/analyzers/figma-analyzer.ts',
'src/core/analyzers/layout-analyzer.ts',
'src/core/analyzers/material-analyzer.ts',
'src/core/comparators/image-comparator.ts',
'src/core/comparators/layout-comparator.ts',
'src/core/comparators/style-comparator.ts',
'src/core/processors/screenshot-processor.ts',
'src/core/processors/svg-processor.ts',
'src/core/processors/report-processor.ts',
'src/types/analyzer.ts',
'src/types/comparator.ts',
'src/types/processor.ts',
'src/types/index.ts',
'package.json',
'vite.config.js',
'tsconfig.json',
'jest.config.js',
'.babelrc'
];
const results = {
total: expectedFiles.length,
found: 0,
missing: [],
valid: []
};
for (const file of expectedFiles) {
if (fs.existsSync(file)) {
results.found++;
results.valid.push(file);
} else {
results.missing.push(file);
}
}
results.successRate = (results.found / results.total) * 100;
console.log(`✅ 找到 ${results.found}/${results.total} 个文件`);
console.log(` 成功率: ${results.successRate.toFixed(1)}%`);
if (results.missing.length > 0) {
console.log(`❌ 缺失文件: ${results.missing.join(', ')}`);
}
return results;
}
/**
* 检查配置文件有效性
*/
function checkConfigFiles() {
console.log('\n⚙️ 检查配置文件有效性...');
const configFiles = [
{ path: 'package.json', check: (content) => JSON.parse(content) },
{ path: 'vite.config.js', check: (content) => content.includes('resolve') },
{ path: 'tsconfig.json', check: (content) => JSON.parse(content) },
{ path: 'jest.config.js', check: (content) => content.includes('moduleNameMapper') },
{ path: '.babelrc', check: (content) => JSON.parse(content) }
];
const results = {
total: configFiles.length,
valid: 0,
invalid: [],
errors: []
};
for (const config of configFiles) {
try {
const content = fs.readFileSync(config.path, 'utf8');
config.check(content);
results.valid++;
} catch (error) {
results.invalid.push(config.path);
results.errors.push(`${config.path}: ${error.message}`);
}
}
results.successRate = (results.valid / results.total) * 100;
console.log(`✅ 验证 ${results.valid}/${results.total} 个配置文件`);
console.log(` 成功率: ${results.successRate.toFixed(1)}%`);
if (results.errors.length > 0) {
console.log(`❌ 配置错误:`);
results.errors.forEach(error => console.log(` ${error}`));
}
return results;
}
/**
* 检查导入路径别名
*/
function checkImportAliases() {
console.log('\n🔗 检查导入路径别名...');
const aliasPatterns = [
'@/core/',
'@/ui/',
'@/utils/',
'@/services/',
'@/types/',
'@/components/',
'@/tools/'
];
const results = {
total: aliasPatterns.length,
found: 0,
missing: [],
valid: []
};
// 检查 vite.config.js 中的别名配置
try {
const viteConfig = fs.readFileSync('vite.config.js', 'utf8');
for (const alias of aliasPatterns) {
if (viteConfig.includes(alias)) {
results.found++;
results.valid.push(alias);
} else {
results.missing.push(alias);
}
}
} catch (error) {
results.errors = [error.message];
}
results.successRate = (results.found / results.total) * 100;
console.log(`✅ 找到 ${results.found}/${results.total} 个路径别名`);
console.log(` 成功率: ${results.successRate.toFixed(1)}%`);
if (results.missing.length > 0) {
console.log(`❌ 缺失别名: ${results.missing.join(', ')}`);
}
return results;
}
/**
* 检查测试覆盖率
*/
function checkTestCoverage() {
console.log('\n🧪 检查测试覆盖率...');
const testDirs = [
'tests/unit',
'tests/integration',
'tests/fixtures'
];
const results = {
total: testDirs.length,
found: 0,
testFiles: 0,
valid: []
};
for (const dir of testDirs) {
if (fs.existsSync(dir)) {
results.found++;
results.valid.push(dir);
// 计算测试文件数量
const countTestFiles = (dirPath) => {
let count = 0;
try {
const items = fs.readdirSync(dirPath);
for (const item of items) {
const fullPath = path.join(dirPath, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
count += countTestFiles(fullPath);
} else if (item.endsWith('.test.js') || item.endsWith('.test.ts')) {
count++;
}
}
} catch (error) {
// 忽略错误
}
return count;
};
results.testFiles += countTestFiles(dir);
}
}
results.successRate = (results.found / results.total) * 100;
console.log(`✅ 找到 ${results.found}/${results.total} 个测试目录`);
console.log(` 发现 ${results.testFiles} 个测试文件`);
console.log(` 成功率: ${results.successRate.toFixed(1)}%`);
return results;
}
/**
* 运行所有验证检查
*/
function runAllValidations() {
console.log('🔍 开始最终验证检查...\n');
// 目录结构检查
validationResults.checks.directoryStructure = checkDirectoryStructure();
// 核心文件检查
validationResults.checks.coreFiles = checkCoreFiles();
// 配置文件检查
validationResults.checks.configFiles = checkConfigFiles();
// 导入别名检查
validationResults.checks.importAliases = checkImportAliases();
// 测试覆盖率检查
validationResults.checks.testCoverage = checkTestCoverage();
// 计算总体结果
const allChecks = Object.values(validationResults.checks);
const totalSuccessRate = allChecks.reduce((sum, check) => sum + check.successRate, 0) / allChecks.length;
const allPassed = allChecks.every(check => check.successRate === 100);
validationResults.summary = {
totalChecks: allChecks.length,
passedChecks: allChecks.filter(check => check.successRate === 100).length,
overallSuccessRate: totalSuccessRate,
allPassed,
timestamp: new Date().toISOString()
};
console.log('\n📊 最终验证结果:');
console.log(` 检查项目: ${validationResults.summary.totalChecks}`);
console.log(` 通过检查: ${validationResults.summary.passedChecks}`);
console.log(` 总体成功率: ${validationResults.summary.overallSuccessRate.toFixed(1)}%`);
console.log(` 全部通过: ${validationResults.summary.allPassed ? '✅' : '❌'}`);
console.log(` 验证时间: ${validationResults.summary.timestamp}\n`);
if (validationResults.summary.allPassed) {
console.log('🎉 恭喜!所有验证检查都通过了!');
console.log('✅ 项目重构完成,可以安全使用。');
} else {
console.log('⚠️ 部分验证检查未通过,请检查上述问题。');
}
// 保存结果
const resultsPath = './validation-results.json';
fs.writeFileSync(resultsPath, JSON.stringify(validationResults, null, 2));
console.log(`💾 验证结果已保存到: ${resultsPath}`);
return validationResults;
}
// 运行验证
if (import.meta.url === `file://${process.argv[1]}`) {
runAllValidations();
}
export { runAllValidations };