UNPKG

build-deploy-tools

Version:

构建部署工具包 - 支持文件复制、SVN操作、系统通知确认等功能,具有科技感进度条和现代化UI

439 lines (385 loc) 11.7 kB
/** * 现代化进度条模块 - 科技感十足的进度显示 * 使用最新的npm库实现炫酷的进度条效果 */ const cliProgress = require('cli-progress') const ora = require('ora') const chalk = require('chalk') const gradient = require('gradient-string') const figures = require('figures') /** * 科技感渐变色配置 */ const TECH_GRADIENTS = { cyber: gradient(['#00f5ff', '#0080ff', '#0040ff']), // 赛博朋克蓝 matrix: gradient(['#00ff41', '#00cc33', '#009926']), // 矩阵绿 neon: gradient(['#ff0080', '#ff4080', '#ff8080']), // 霓虹粉 plasma: gradient(['#8a2be2', '#4169e1', '#00bfff']), // 等离子紫蓝 fire: gradient(['#ff4500', '#ff6347', '#ffa500']), // 火焰橙 ice: gradient(['#00ffff', '#87ceeb', '#b0e0e6']) // 冰蓝 } /** * 科技感图标配置 */ const TECH_ICONS = { scanning: '🔍', processing: '⚡', uploading: '📤', downloading: '📥', syncing: '🔄', building: '🔧', deploying: '🚀', checking: '✨', success: '🎉', error: '💥', warning: '⚠️', info: 'ℹ️' } /** * 创建现代化单一进度条 * @param {Object} options - 配置选项 * @returns {Object} 进度条控制对象 */ function createModernProgressBar (options = {}) { const { title = '处理中', total = 100, theme = 'cyber', showETA = true, showPercentage = true, showValue = true, width = 40 } = options const gradient_func = TECH_GRADIENTS[theme] || TECH_GRADIENTS.cyber // 自定义进度条格式 const format = [ gradient_func('{bar}'), chalk.cyan('|'), chalk.yellow('{percentage}%'), chalk.gray('|'), chalk.green('{value}/{total}'), chalk.gray('|'), chalk.magenta('ETA: {eta}s'), chalk.gray('|'), chalk.blue('{title}') ].join(' ') const bar = new cliProgress.SingleBar( { format: format, barCompleteChar: '█', barIncompleteChar: '░', hideCursor: true, barsize: width, stopOnComplete: true, clearOnComplete: false, etaBuffer: 10 }, cliProgress.Presets.shades_grey ) let isStarted = false return { /** * 启动进度条 * @param {number} totalValue - 总值 * @param {number} startValue - 起始值 * @param {Object} payload - 额外数据 */ start: (totalValue = total, startValue = 0, payload = {}) => { if (!isStarted) { console.log(gradient_func(`\n🚀 ${title} 开始执行...\n`)) bar.start(totalValue, startValue, { title, ...payload }) isStarted = true } }, /** * 更新进度 * @param {number} value - 当前值 * @param {Object} payload - 额外数据 */ update: (value, payload = {}) => { if (isStarted) { bar.update(value, { title, ...payload }) } }, /** * 增加进度 * @param {number} increment - 增量 * @param {Object} payload - 额外数据 */ increment: (increment = 1, payload = {}) => { if (isStarted) { bar.increment(increment, { title, ...payload }) } }, /** * 停止进度条 * @param {string} message - 完成消息 */ stop: (message = '完成') => { if (isStarted) { bar.stop() console.log(gradient_func(`\n✨ ${message}!\n`)) isStarted = false } }, /** * 获取当前进度值 */ getProgress: () => { return bar.getProgress() } } } /** * 创建多阶段科技感进度条 * @param {Array} stages - 阶段配置数组 * @param {Object} options - 配置选项 * @returns {Object} 多阶段进度条控制对象 */ function createTechMultiStageProgress (stages, options = {}) { const { operation = '操作', theme = 'cyber', showStageDetails = true, animationSpeed = 100 } = options let currentStageIndex = 0 let currentStageProgress = 0 let isCompleted = false let spinner = null let progressBar = null const gradient_func = TECH_GRADIENTS[theme] || TECH_GRADIENTS.cyber const totalStages = stages.length // 创建主进度条 const mainProgressBar = createModernProgressBar({ title: `${operation} 总进度`, total: totalStages * 100, theme: theme, width: 50 }) /** * 显示当前阶段信息 */ function displayStageInfo () { if (isCompleted || currentStageIndex >= totalStages) return const stage = stages[currentStageIndex] const stageIcon = TECH_ICONS[stage.type] || TECH_ICONS.processing const stageTitle = `${stageIcon} ${stage.name}` // 停止之前的spinner if (spinner) { spinner.stop() } // 创建新的spinner用于当前阶段 spinner = ora({ text: gradient_func(stageTitle), spinner: { interval: animationSpeed, frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] } }).start() // 创建阶段进度条 if (showStageDetails && stage.showProgress !== false) { setTimeout(() => { if (spinner) spinner.stop() progressBar = createModernProgressBar({ title: stageTitle, total: 100, theme: theme, width: 30 }) progressBar.start(100, 0) }, 500) } } /** * 更新总体进度 */ function updateOverallProgress () { const overallProgress = currentStageIndex * 100 + currentStageProgress mainProgressBar.update(overallProgress, { title: `${operation} (${currentStageIndex + 1}/${totalStages})` }) } // 初始化 console.log(gradient_func(`\n🌟 ${operation} 系统启动中...\n`)) mainProgressBar.start(totalStages * 100, 0) const progressController = { /** * 开始第一个阶段 */ start: () => { if (stages.length > 0) { displayStageInfo() updateOverallProgress() } }, /** * 更新当前阶段进度 * @param {number} progress - 进度百分比 (0-100) * @param {string} message - 状态消息 */ updateStage: (progress, message = null) => { if (isCompleted) return currentStageProgress = Math.min(100, Math.max(0, progress)) if (progressBar) { progressBar.update(currentStageProgress, { title: message || stages[currentStageIndex]?.name || '处理中' }) } updateOverallProgress() if (message && spinner && !progressBar) { spinner.text = gradient_func(`${TECH_ICONS.processing} ${message}`) } }, /** * 进入下一个阶段 * @param {string} completionMessage - 阶段完成消息 */ nextStage: (completionMessage = null) => { if (isCompleted) return // 完成当前阶段 currentStageProgress = 100 updateOverallProgress() // 停止当前阶段的显示 if (spinner) { spinner.succeed( gradient_func( completionMessage || `${stages[currentStageIndex]?.name} 完成` ) ) spinner = null } if (progressBar) { progressBar.stop(completionMessage || '阶段完成') progressBar = null } // 移动到下一阶段 currentStageIndex++ currentStageProgress = 0 if (currentStageIndex < totalStages) { // 短暂延迟后开始下一阶段 setTimeout(() => { displayStageInfo() updateOverallProgress() }, 300) } else { // 所有阶段完成 progressController.complete() } }, /** * 完成所有阶段 * @param {string} message - 完成消息 */ complete: (message = null) => { if (isCompleted) return isCompleted = true // 清理所有进度显示 if (spinner) { spinner.stop() } if (progressBar) { progressBar.stop() } // 完成主进度条 mainProgressBar.update(totalStages * 100) mainProgressBar.stop(message || `${operation}全部完成`) // 显示炫酷的完成效果 console.log(gradient_func('═'.repeat(60))) console.log(gradient_func(`🎊 ${operation} 执行成功! 🎊`)) console.log(gradient_func('═'.repeat(60))) }, /** * 错误终止 * @param {string} error - 错误消息 */ error: error => { isCompleted = true // 清理所有进度显示 if (spinner) { spinner.fail(chalk.red(`❌ ${error}`)) } if (progressBar) { progressBar.stop('操作失败') } mainProgressBar.stop('操作失败') // 显示错误信息 console.log(chalk.red('═'.repeat(60))) console.log(chalk.red(`💥 ${operation} 执行失败: ${error}`)) console.log(chalk.red('═'.repeat(60))) }, /** * 获取当前状态 */ getStatus: () => ({ currentStage: currentStageIndex, totalStages: totalStages, stageProgress: currentStageProgress, overallProgress: (currentStageIndex * 100 + currentStageProgress) / totalStages, isCompleted: isCompleted }) } return progressController } /** * 创建简单的科技感spinner * @param {string} text - 显示文本 * @param {string} theme - 主题色彩 * @returns {Object} spinner控制对象 */ function createTechSpinner (text = '处理中...', theme = 'cyber') { const gradient_func = TECH_GRADIENTS[theme] || TECH_GRADIENTS.cyber return ora({ text: gradient_func(text), spinner: { interval: 80, frames: [ '▰▱▱▱▱▱▱', '▰▰▱▱▱▱▱', '▰▰▰▱▱▱▱', '▰▰▰▰▱▱▱', '▰▰▰▰▰▱▱', '▰▰▰▰▰▰▱', '▰▰▰▰▰▰▰', '▱▰▰▰▰▰▰', '▱▱▰▰▰▰▰', '▱▱▱▰▰▰▰', '▱▱▱▱▰▰▰', '▱▱▱▱▱▰▰', '▱▱▱▱▱▱▰' ] } }) } /** * 显示科技感成功消息 * @param {string} message - 消息内容 * @param {string} theme - 主题 */ function showTechSuccess (message, theme = 'cyber') { const gradient_func = TECH_GRADIENTS[theme] || TECH_GRADIENTS.cyber console.log( '\n' + gradient_func('🌟 ═══════════════════════════════════════ 🌟') ) console.log(gradient_func(` ✨ ${message} ✨`)) console.log(gradient_func('🌟 ═══════════════════════════════════════ 🌟\n')) } /** * 显示科技感错误消息 * @param {string} message - 错误消息 */ function showTechError (message) { console.log('\n' + chalk.red('💥 ═══════════════════════════════════════ 💥')) console.log(chalk.red(` ❌ ${message} ❌`)) console.log(chalk.red('💥 ═══════════════════════════════════════ 💥\n')) } module.exports = { createModernProgressBar, createTechMultiStageProgress, createTechSpinner, showTechSuccess, showTechError, TECH_GRADIENTS, TECH_ICONS }