auto-request
Version:
通过Yapi JSON Schema生成接口Axios或Taro接口
158 lines (135 loc) • 4.46 kB
JavaScript
/**
* 交互式运行示例脚本
* 使用方式:
* node scripts/run-example.js # 交互式选择
* node scripts/run-example.js all-api # 运行指定示例
* node scripts/run-example.js --all # 运行所有示例
*/
const { execSync } = require('child_process');
const readline = require('readline');
const path = require('path');
const fs = require('fs');
// 扫描 example 目录,找出所有有效的示例
const exampleDir = path.join(__dirname, '..', 'example');
const examples = [];
if (fs.existsSync(exampleDir)) {
const dirs = fs.readdirSync(exampleDir);
dirs.forEach((dir) => {
const dirPath = path.join(exampleDir, dir);
if (fs.statSync(dirPath).isDirectory()) {
const indexTs = path.join(dirPath, 'index.ts');
const indexJs = path.join(dirPath, 'index.js');
if (fs.existsSync(indexTs) || fs.existsSync(indexJs)) {
const swaggerJson = path.join(dirPath, 'swagger.json');
const hasSwagger = fs.existsSync(swaggerJson);
examples.push({
name: dir,
path: dirPath,
hasSwagger,
script: fs.existsSync(indexTs) ? 'index.ts' : 'index.js',
});
}
}
});
}
// 获取命令行参数
const args = process.argv.slice(2);
// 运行指定的示例
function runExample(example, index) {
console.log(`\n${'='.repeat(60)}`);
console.log(`📝 [${index + 1}/${examples.length}] 运行示例: ${example.name}`);
console.log(`${'='.repeat(60)}\n`);
const rootDir = path.join(__dirname, '..');
const cmd = example.script.endsWith('.ts')
? `npx tsx ./example/${example.name}/${example.script}`
: `node ./example/${example.name}/${example.script}`;
try {
execSync(cmd, {
stdio: 'inherit',
cwd: rootDir,
env: { ...process.env, NODE_ENV: 'development' },
});
console.log(`\n✅ ${example.name} - 完成\n`);
return true;
} catch (error) {
console.log(`\n❌ ${example.name} - 失败\n`);
return false;
}
}
// 运行所有示例
function runAllExamples() {
console.log(`\n🚀 开始运行所有示例 (共 ${examples.length} 个)\n`);
let passCount = 0;
let failCount = 0;
examples.forEach((example, index) => {
const success = runExample(example, index);
if (success) {
passCount++;
} else {
failCount++;
}
});
console.log(`\n${'='.repeat(60)}`);
console.log(`📊 运行结果: ${passCount} 成功, ${failCount} 失败`);
console.log(`${'='.repeat(60)}\n`);
return failCount === 0;
}
// 交互式选择示例
function interactiveMode() {
console.log('\n📚 可用的示例:\n');
examples.forEach((example, index) => {
const swaggerInfo = example.hasSwagger ? '✓' : '✗';
console.log(` ${index + 1}. ${example.name.padEnd(20)} [Swagger: ${swaggerInfo}]`);
});
console.log(` ${examples.length + 1}. 运行所有示例`);
console.log(` 0. 退出\n`);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question('请选择要运行的示例 (输入编号): ', (answer) => {
rl.close();
const choice = parseInt(answer);
if (choice === 0) {
console.log('\n👋 已退出\n');
process.exit(0);
} else if (choice === examples.length + 1) {
const success = runAllExamples();
process.exit(success ? 0 : 1);
} else if (choice >= 1 && choice <= examples.length) {
const example = examples[choice - 1];
const success = runExample(example, choice - 1);
process.exit(success ? 0 : 1);
} else {
console.log('\n❌ 无效的选择\n');
process.exit(1);
}
});
}
// 主逻辑
if (examples.length === 0) {
console.log('\n❌ 没有找到有效的示例\n');
process.exit(1);
}
if (args.length === 0) {
// 交互模式
interactiveMode();
} else if (args[0] === '--all' || args[0] === '-a') {
// 运行所有示例
const success = runAllExamples();
process.exit(success ? 0 : 1);
} else {
// 运行指定的示例
const exampleName = args[0];
const example = examples.find((ex) => ex.name === exampleName);
if (!example) {
console.log(`\n❌ 找不到示例: ${exampleName}\n`);
console.log('可用的示例:');
examples.forEach((ex) => console.log(` - ${ex.name}`));
console.log('');
process.exit(1);
}
const success = runExample(example, 0);
process.exit(success ? 0 : 1);
}