UNPKG

vibe-cli-tool

Version:

VibeCLI v1.9 - 模板商店生态,智能部署生成,多语言支持,交互式学习系统,企业级Web全栈应用CLI工具

144 lines 5.93 kB
import inquirer from 'inquirer'; import chalk from 'chalk'; import ora from 'ora'; import { VibeCLICore } from '../core/vibecli-core.js'; const AVAILABLE_FEATURES = { auth: { name: '用户认证系统', description: '完整的用户注册、登录、权限管理' }, crud: { name: 'CRUD操作', description: '数据增删改查操作' }, upload: { name: '文件上传', description: '多文件上传和存储管理' }, email: { name: '邮件系统', description: '邮件发送和模板管理' }, payment: { name: '支付集成', description: 'Stripe等支付平台集成' }, realtime: { name: '实时通信', description: 'WebSocket实时功能' } }; export async function addFeature(featureName, options) { console.log(chalk.blue.bold('\n📦 添加功能模块\n')); const core = new VibeCLICore(); try { // 验证功能名称 if (!AVAILABLE_FEATURES[featureName.toLowerCase()]) { console.log(chalk.yellow('❓ 可用的功能模块:')); Object.entries(AVAILABLE_FEATURES).forEach(([key, feature]) => { console.log(` ${chalk.cyan(key)}: ${feature.name} - ${chalk.gray(feature.description)}`); }); process.exit(1); } const feature = AVAILABLE_FEATURES[featureName.toLowerCase()]; console.log(chalk.blue(`功能: ${feature.name}`)); console.log(chalk.gray(`${feature.description}\n`)); // 获取功能配置 const featureConfig = await promptForFeatureConfig(featureName.toLowerCase()); // 使用核心API添加功能 const spinner = ora(`正在添加 ${feature.name}...`).start(); const result = await core.addFeature(process.cwd(), { name: featureName.toLowerCase(), options: featureConfig, force: options.force }); if (result.success) { spinner.succeed(`${feature.name} 添加成功!`); // 显示生成的文件 console.log(chalk.green.bold('\n✅ 功能添加完成!\n')); if (result.addedFiles.length > 0) { console.log(chalk.blue('新增文件:')); result.addedFiles.forEach(file => { console.log(` ✓ ${file}`); }); } if (result.modifiedFiles.length > 0) { console.log(chalk.blue('\n修改文件:')); result.modifiedFiles.forEach(file => { console.log(` ✓ ${file}`); }); } // 显示后续步骤 if (result.instructions.length > 0) { console.log(chalk.blue('\n下一步操作:')); result.instructions.forEach((instruction, index) => { console.log(` ${index + 1}. ${instruction}`); }); } console.log(''); } else { spinner.fail('功能添加失败'); console.error(chalk.red('❌ ' + result.message)); if (result.error) { console.error(chalk.red('详细错误: ' + result.error)); } process.exit(1); } } catch (error) { console.error(chalk.red('❌ 添加功能时发生错误:')); console.error(chalk.red(error instanceof Error ? error.message : String(error))); process.exit(1); } } async function promptForFeatureConfig(featureName) { const questions = []; switch (featureName) { case 'auth': questions.push({ type: 'list', name: 'authProvider', message: '选择认证方式:', choices: [ { name: 'JWT (推荐)', value: 'jwt' }, { name: 'NextAuth.js', value: 'nextauth' }, { name: 'Supabase Auth', value: 'supabase' } ], default: 'jwt' }, { type: 'checkbox', name: 'authFeatures', message: '选择认证功能:', choices: [ { name: '邮箱验证', value: 'email-verification', checked: true }, { name: '密码重置', value: 'password-reset', checked: true }, { name: '社交登录', value: 'social-login', checked: false }, { name: '双因素认证', value: '2fa', checked: false } ] }); break; case 'upload': questions.push({ type: 'list', name: 'uploadProvider', message: '选择存储服务:', choices: [ { name: 'Cloudflare R2', value: 'r2' }, { name: 'AWS S3', value: 's3' }, { name: '本地存储', value: 'local' } ], default: 'r2' }, { type: 'input', name: 'maxFileSize', message: '最大文件大小 (MB):', default: '10', validate: (input) => { const num = parseInt(input); return num > 0 && num <= 100 ? true : '请输入1-100之间的数字'; } }); break; case 'payment': questions.push({ type: 'list', name: 'paymentProvider', message: '选择支付服务:', choices: [ { name: 'Stripe', value: 'stripe' }, { name: '支付宝', value: 'alipay' }, { name: '微信支付', value: 'wechat' } ], default: 'stripe' }); break; } if (questions.length === 0) { return {}; } return await inquirer.prompt(questions); } //# sourceMappingURL=add.js.map