UNPKG

auto-request

Version:

通过Yapi JSON Schema生成接口Axios或Taro接口

158 lines (135 loc) 4.46 kB
#!/usr/bin/env node /** * 交互式运行示例脚本 * 使用方式: * 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); }