- 重构LanguageUtils为LanguageService,实现ILanguageService接口 - 移除自定义验证管道和装饰器,使用标准NestJS验证 - 集成框架ValidatorService进行业务验证 - 简化目录结构,移除不必要的子目录 - 支持模块化语言包加载(common、user、order等) - 统一API响应格式(code、msg、data、timestamp) - 添加ValidationExceptionFilter处理多语言验证错误 - 完善多语言示例和文档
320 lines
10 KiB
JavaScript
320 lines
10 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* 测试修复脚本
|
|
* 验证所有修复是否正确
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
class FixValidator {
|
|
constructor() {
|
|
this.errors = [];
|
|
this.warnings = [];
|
|
this.passed = [];
|
|
}
|
|
|
|
/**
|
|
* 运行所有验证
|
|
*/
|
|
async run() {
|
|
console.log('🧪 开始验证修复...\n');
|
|
|
|
// 验证1: command-generator.js 导入路径
|
|
console.log('📝 验证1: command-generator.js 导入路径修复');
|
|
this.validateCommandGeneratorImport();
|
|
|
|
// 验证2: BaseGenerator 存在性
|
|
console.log('\n📝 验证2: BaseGenerator 基类存在性');
|
|
this.validateBaseGenerator();
|
|
|
|
// 验证3: entity-generator.js 继承 BaseGenerator
|
|
console.log('\n📝 验证3: entity-generator.js 继承 BaseGenerator');
|
|
this.validateEntityGeneratorInheritance();
|
|
|
|
// 验证4: command-generator.js 继承 BaseGenerator
|
|
console.log('\n📝 验证4: command-generator.js 继承 BaseGenerator');
|
|
this.validateCommandGeneratorInheritance();
|
|
|
|
// 验证5: Quality Gate 工具存在
|
|
console.log('\n📝 验证5: Quality Gate 工具存在');
|
|
this.validateQualityGate();
|
|
|
|
// 验证6: migration-coordinator.js 集成 Quality Gate
|
|
console.log('\n📝 验证6: migration-coordinator.js 集成 Quality Gate');
|
|
this.validateCoordinatorQualityGate();
|
|
|
|
// 验证7: README.md 文档更新
|
|
console.log('\n📝 验证7: README.md 文档更新');
|
|
this.validateReadmeUpdate();
|
|
|
|
// 输出验证结果
|
|
this.printResults();
|
|
}
|
|
|
|
/**
|
|
* 验证 command-generator.js 导入路径
|
|
*/
|
|
validateCommandGeneratorImport() {
|
|
const filePath = path.join(__dirname, 'generators/command-generator.js');
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
|
|
// 检查错误的导入
|
|
if (content.includes("@wwjCore/exceptions/Customexceptions")) {
|
|
this.errors.push('command-generator.js 仍使用错误的导入路径 @wwjCore/exceptions/Customexceptions');
|
|
console.log(' ❌ 仍使用错误的导入路径');
|
|
} else if (content.includes("@wwjCommon/exceptions/business.exception")) {
|
|
this.passed.push('command-generator.js 使用正确的导入路径');
|
|
console.log(' ✅ 使用正确的导入路径 @wwjCommon/exceptions/business.exception');
|
|
} else {
|
|
this.warnings.push('command-generator.js 未找到 BusinessException 导入');
|
|
console.log(' ⚠️ 未找到 BusinessException 导入');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证 BaseGenerator 存在
|
|
*/
|
|
validateBaseGenerator() {
|
|
const filePath = path.join(__dirname, 'generators/base-generator.js');
|
|
|
|
if (!fs.existsSync(filePath)) {
|
|
this.errors.push('base-generator.js 不存在');
|
|
console.log(' ❌ base-generator.js 不存在');
|
|
return;
|
|
}
|
|
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
|
|
// 检查关键方法
|
|
const requiredMethods = ['writeFile', 'ensureDir', 'readFile', 'printStats'];
|
|
let allMethodsPresent = true;
|
|
|
|
for (const method of requiredMethods) {
|
|
if (!content.includes(`${method}(`)) {
|
|
this.errors.push(`base-generator.js 缺少方法: ${method}`);
|
|
allMethodsPresent = false;
|
|
}
|
|
}
|
|
|
|
if (allMethodsPresent) {
|
|
this.passed.push('BaseGenerator 包含所有必需方法');
|
|
console.log(' ✅ 包含所有必需方法');
|
|
} else {
|
|
console.log(' ❌ 缺少部分方法');
|
|
}
|
|
|
|
// 检查 dry-run 支持
|
|
if (content.includes('this.dryRun')) {
|
|
this.passed.push('BaseGenerator 支持 dry-run 模式');
|
|
console.log(' ✅ 支持 dry-run 模式');
|
|
} else {
|
|
this.errors.push('BaseGenerator 不支持 dry-run 模式');
|
|
console.log(' ❌ 不支持 dry-run 模式');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证 entity-generator.js 继承
|
|
*/
|
|
validateEntityGeneratorInheritance() {
|
|
const filePath = path.join(__dirname, 'generators/entity-generator.js');
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
|
|
if (content.includes("extends BaseGenerator")) {
|
|
this.passed.push('entity-generator.js 继承 BaseGenerator');
|
|
console.log(' ✅ 继承 BaseGenerator');
|
|
} else {
|
|
this.errors.push('entity-generator.js 未继承 BaseGenerator');
|
|
console.log(' ❌ 未继承 BaseGenerator');
|
|
}
|
|
|
|
if (content.includes("require('./base-generator')")) {
|
|
this.passed.push('entity-generator.js 导入 BaseGenerator');
|
|
console.log(' ✅ 导入 BaseGenerator');
|
|
} else {
|
|
this.errors.push('entity-generator.js 未导入 BaseGenerator');
|
|
console.log(' ❌ 未导入 BaseGenerator');
|
|
}
|
|
|
|
if (content.includes("this.writeFile(")) {
|
|
this.passed.push('entity-generator.js 使用 BaseGenerator.writeFile');
|
|
console.log(' ✅ 使用 BaseGenerator.writeFile');
|
|
} else {
|
|
this.warnings.push('entity-generator.js 可能未使用 BaseGenerator.writeFile');
|
|
console.log(' ⚠️ 可能未使用 BaseGenerator.writeFile');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证 command-generator.js 继承
|
|
*/
|
|
validateCommandGeneratorInheritance() {
|
|
const filePath = path.join(__dirname, 'generators/command-generator.js');
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
|
|
if (content.includes("extends BaseGenerator")) {
|
|
this.passed.push('command-generator.js 继承 BaseGenerator');
|
|
console.log(' ✅ 继承 BaseGenerator');
|
|
} else {
|
|
this.errors.push('command-generator.js 未继承 BaseGenerator');
|
|
console.log(' ❌ 未继承 BaseGenerator');
|
|
}
|
|
|
|
if (content.includes("this.writeFile(")) {
|
|
this.passed.push('command-generator.js 使用 BaseGenerator.writeFile');
|
|
console.log(' ✅ 使用 BaseGenerator.writeFile');
|
|
} else {
|
|
this.warnings.push('command-generator.js 可能未使用 BaseGenerator.writeFile');
|
|
console.log(' ⚠️ 可能未使用 BaseGenerator.writeFile');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证 Quality Gate 工具
|
|
*/
|
|
validateQualityGate() {
|
|
const filePath = path.join(__dirname, 'generators/quality-gate.js');
|
|
|
|
if (!fs.existsSync(filePath)) {
|
|
this.errors.push('quality-gate.js 不存在');
|
|
console.log(' ❌ quality-gate.js 不存在');
|
|
return;
|
|
}
|
|
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
|
|
// 检查关键方法
|
|
const requiredMethods = ['checkTypeScript', 'checkESLint', 'run', 'printStats'];
|
|
let allMethodsPresent = true;
|
|
|
|
for (const method of requiredMethods) {
|
|
if (!content.includes(`${method}(`)) {
|
|
this.errors.push(`quality-gate.js 缺少方法: ${method}`);
|
|
allMethodsPresent = false;
|
|
}
|
|
}
|
|
|
|
if (allMethodsPresent) {
|
|
this.passed.push('Quality Gate 包含所有必需方法');
|
|
console.log(' ✅ 包含所有必需方法');
|
|
} else {
|
|
console.log(' ❌ 缺少部分方法');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证 migration-coordinator.js 集成
|
|
*/
|
|
validateCoordinatorQualityGate() {
|
|
const filePath = path.join(__dirname, 'migration-coordinator.js');
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
|
|
if (content.includes("require('./generators/quality-gate')")) {
|
|
this.passed.push('migration-coordinator.js 导入 QualityGate');
|
|
console.log(' ✅ 导入 QualityGate');
|
|
} else {
|
|
this.errors.push('migration-coordinator.js 未导入 QualityGate');
|
|
console.log(' ❌ 未导入 QualityGate');
|
|
}
|
|
|
|
if (content.includes("runQualityGate")) {
|
|
this.passed.push('migration-coordinator.js 包含 runQualityGate 方法');
|
|
console.log(' ✅ 包含 runQualityGate 方法');
|
|
} else {
|
|
this.errors.push('migration-coordinator.js 未包含 runQualityGate 方法');
|
|
console.log(' ❌ 未包含 runQualityGate 方法');
|
|
}
|
|
|
|
if (content.includes("await this.runQualityGate()")) {
|
|
this.passed.push('migration-coordinator.js 调用 runQualityGate');
|
|
console.log(' ✅ 在流程中调用 runQualityGate');
|
|
} else {
|
|
this.errors.push('migration-coordinator.js 未在流程中调用 runQualityGate');
|
|
console.log(' ❌ 未在流程中调用 runQualityGate');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 验证 README.md 更新
|
|
*/
|
|
validateReadmeUpdate() {
|
|
const filePath = path.join(__dirname, 'README.md');
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
|
|
if (content.includes('dry-run') || content.includes('DRY_RUN')) {
|
|
this.passed.push('README.md 包含 dry-run 使用说明');
|
|
console.log(' ✅ 包含 dry-run 使用说明');
|
|
} else {
|
|
this.warnings.push('README.md 缺少 dry-run 使用说明');
|
|
console.log(' ⚠️ 缺少 dry-run 使用说明');
|
|
}
|
|
|
|
if (content.includes('quality-gate') || content.includes('Quality Gate')) {
|
|
this.passed.push('README.md 包含 Quality Gate 说明');
|
|
console.log(' ✅ 包含 Quality Gate 说明');
|
|
} else {
|
|
this.warnings.push('README.md 缺少 Quality Gate 说明');
|
|
console.log(' ⚠️ 缺少 Quality Gate 说明');
|
|
}
|
|
|
|
if (content.includes('base-generator')) {
|
|
this.passed.push('README.md 包含 BaseGenerator 说明');
|
|
console.log(' ✅ 包含 BaseGenerator 说明');
|
|
} else {
|
|
this.warnings.push('README.md 缺少 BaseGenerator 说明');
|
|
console.log(' ⚠️ 缺少 BaseGenerator 说明');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 输出验证结果
|
|
*/
|
|
printResults() {
|
|
console.log('\n\n📊 验证结果汇总');
|
|
console.log('='.repeat(60));
|
|
|
|
console.log(`\n✅ 通过项 (${this.passed.length}):`);
|
|
this.passed.forEach(item => console.log(` - ${item}`));
|
|
|
|
if (this.warnings.length > 0) {
|
|
console.log(`\n⚠️ 警告项 (${this.warnings.length}):`);
|
|
this.warnings.forEach(item => console.log(` - ${item}`));
|
|
}
|
|
|
|
if (this.errors.length > 0) {
|
|
console.log(`\n❌ 错误项 (${this.errors.length}):`);
|
|
this.errors.forEach(item => console.log(` - ${item}`));
|
|
}
|
|
|
|
console.log('\n' + '='.repeat(60));
|
|
|
|
const totalChecks = this.passed.length + this.warnings.length + this.errors.length;
|
|
const successRate = totalChecks > 0
|
|
? ((this.passed.length / totalChecks) * 100).toFixed(2)
|
|
: '0.00';
|
|
|
|
console.log(`📈 成功率: ${successRate}% (${this.passed.length}/${totalChecks})`);
|
|
|
|
if (this.errors.length === 0) {
|
|
console.log('\n🎉 所有必需检查已通过!');
|
|
return true;
|
|
} else {
|
|
console.log(`\n💔 发现 ${this.errors.length} 个错误,需要修复`);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 运行验证
|
|
if (require.main === module) {
|
|
const validator = new FixValidator();
|
|
validator.run().then(passed => {
|
|
process.exit(passed ? 0 : 1);
|
|
});
|
|
}
|
|
|
|
module.exports = FixValidator;
|
|
|