|
| 1 | +#!/usr/bin/env node |
| 2 | +/** |
| 3 | + * Demo: Interactive Dependency Upgrade UI |
| 4 | + * |
| 5 | + * Run with: pnpm dev:upgrade |
| 6 | + * Or: npx ts-node dev/demo-upgrade.ts |
| 7 | + */ |
| 8 | + |
| 9 | +import { upgradePrompt, PackageInfo, createSpinner } from '../src/ui'; |
| 10 | +import { cyan, green, yellow, dim, white } from 'yanse'; |
| 11 | + |
| 12 | +const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); |
| 13 | + |
| 14 | +// Simulated package data (like pnpm outdated would return) |
| 15 | +const MOCK_PACKAGES: PackageInfo[] = [ |
| 16 | + { name: 'typescript', current: '5.2.2', latest: '5.7.2', type: 'devDependencies' }, |
| 17 | + { name: 'react', current: '18.2.0', latest: '19.0.0', type: 'dependencies' }, |
| 18 | + { name: 'react-dom', current: '18.2.0', latest: '19.0.0', type: 'dependencies' }, |
| 19 | + { name: '@types/node', current: '20.8.0', latest: '22.10.2', type: 'devDependencies' }, |
| 20 | + { name: 'eslint', current: '8.50.0', latest: '9.17.0', type: 'devDependencies' }, |
| 21 | + { name: 'prettier', current: '3.0.3', latest: '3.4.2', type: 'devDependencies' }, |
| 22 | + { name: 'jest', current: '29.6.4', latest: '29.7.0', type: 'devDependencies' }, |
| 23 | + { name: 'lodash', current: '4.17.20', latest: '4.17.21', type: 'dependencies' }, |
| 24 | + { name: 'axios', current: '1.5.0', latest: '1.7.9', type: 'dependencies' }, |
| 25 | + { name: 'zod', current: '3.22.2', latest: '3.24.1', type: 'dependencies' }, |
| 26 | + { name: 'vitest', current: '0.34.4', latest: '2.1.8', type: 'devDependencies' }, |
| 27 | + { name: '@tanstack/react-query', current: '4.35.3', latest: '5.62.8', type: 'dependencies' }, |
| 28 | + { name: 'tailwindcss', current: '3.3.3', latest: '3.4.17', type: 'devDependencies' }, |
| 29 | + { name: 'next', current: '13.5.2', latest: '15.1.3', type: 'dependencies' }, |
| 30 | + { name: 'prisma', current: '5.3.1', latest: '6.1.0', type: 'devDependencies' }, |
| 31 | +]; |
| 32 | + |
| 33 | +async function main() { |
| 34 | + console.log('\n' + white('═'.repeat(70))); |
| 35 | + console.log(white(' 📦 Interactive Dependency Upgrade Demo')); |
| 36 | + console.log(white('═'.repeat(70)) + '\n'); |
| 37 | + |
| 38 | + // Show loading spinner first |
| 39 | + const spinner = createSpinner('Checking for outdated packages...'); |
| 40 | + spinner.start(); |
| 41 | + await sleep(1500); |
| 42 | + spinner.succeed(`Found ${MOCK_PACKAGES.length} packages with updates available`); |
| 43 | + |
| 44 | + console.log(''); |
| 45 | + console.log(dim('Controls:')); |
| 46 | + console.log(dim(' ↑/↓ Navigate packages')); |
| 47 | + console.log(dim(' SPACE Toggle selection')); |
| 48 | + console.log(dim(' → Change target version')); |
| 49 | + console.log(dim(' ENTER Confirm selection')); |
| 50 | + console.log(dim(' ESC Cancel')); |
| 51 | + console.log(dim(' Type Filter packages')); |
| 52 | + console.log(''); |
| 53 | + |
| 54 | + try { |
| 55 | + const result = await upgradePrompt(MOCK_PACKAGES, 10); |
| 56 | + |
| 57 | + console.log(''); |
| 58 | + |
| 59 | + if (result.updates.length === 0) { |
| 60 | + console.log(yellow('No packages selected for upgrade.')); |
| 61 | + } else { |
| 62 | + console.log(green(`\n✔ Selected ${result.updates.length} packages for upgrade:\n`)); |
| 63 | + |
| 64 | + for (const update of result.updates) { |
| 65 | + console.log(` ${cyan(update.name.padEnd(30))} ${dim(update.from)} ${dim('→')} ${green(update.to)}`); |
| 66 | + } |
| 67 | + |
| 68 | + console.log(''); |
| 69 | + console.log(dim('In a real scenario, this would run:')); |
| 70 | + console.log(dim(` pnpm update ${result.updates.map(u => `${u.name}@${u.to}`).join(' ')}`)); |
| 71 | + } |
| 72 | + } catch (error) { |
| 73 | + console.error('Error:', error); |
| 74 | + } |
| 75 | + |
| 76 | + console.log('\n' + white('═'.repeat(70))); |
| 77 | + console.log(white(' ✨ Demo complete!')); |
| 78 | + console.log(white('═'.repeat(70)) + '\n'); |
| 79 | +} |
| 80 | + |
| 81 | +main().catch(console.error); |
0 commit comments