UNPKG

rynex

Version:

A minimalist TypeScript framework for building reactive web applications with no virtual DOM

136 lines 4.88 kB
/** * Interactive CLI Prompts * Minimal, colorful prompts for Rynex CLI */ import * as readline from 'readline'; // ANSI color codes const colors = { reset: '\x1b[0m', bright: '\x1b[1m', dim: '\x1b[2m', // Colors green: '\x1b[32m', cyan: '\x1b[36m', yellow: '\x1b[33m', blue: '\x1b[34m', magenta: '\x1b[35m', white: '\x1b[37m', gray: '\x1b[90m', // Backgrounds bgGreen: '\x1b[42m', bgCyan: '\x1b[46m', }; /** * Create readline interface */ function createInterface() { return readline.createInterface({ input: process.stdin, output: process.stdout }); } /** * Ask a question and get input */ function ask(question) { const rl = createInterface(); return new Promise((resolve) => { rl.question(question, (answer) => { rl.close(); resolve(answer.trim()); }); }); } /** * Select from a list of options */ export async function select(message, choices, defaultValue) { console.log(`\n${colors.cyan}${colors.bright}?${colors.reset} ${colors.bright}${message}${colors.reset}\n`); choices.forEach((choice, index) => { const isDefault = choice.value === defaultValue; const prefix = isDefault ? `${colors.green}${colors.reset}` : ' '; const label = isDefault ? `${colors.cyan}${choice.label}${colors.reset}` : `${colors.gray}${choice.label}${colors.reset}`; const desc = choice.description ? `${colors.dim} - ${choice.description}${colors.reset}` : ''; console.log(`${prefix} ${colors.gray}${index + 1}.${colors.reset} ${label}${desc}`); }); console.log(); const answer = await ask(`${colors.gray}Enter choice (1-${choices.length})${colors.reset} ${colors.dim}[${choices.findIndex(c => c.value === defaultValue) + 1}]${colors.reset}: `); if (!answer && defaultValue) { return defaultValue; } const index = parseInt(answer) - 1; if (index >= 0 && index < choices.length) { return choices[index].value; } return defaultValue || choices[0].value; } /** * Confirm yes/no question */ export async function confirm(message, defaultValue = true) { const defaultText = defaultValue ? 'Y/n' : 'y/N'; const answer = await ask(`${colors.cyan}?${colors.reset} ${colors.bright}${message}${colors.reset} ${colors.dim}(${defaultText})${colors.reset}: `); if (!answer) { return defaultValue; } return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes'; } /** * Text input */ export async function input(message, defaultValue) { const defaultText = defaultValue ? `${colors.dim}(${defaultValue})${colors.reset}` : ''; const answer = await ask(`${colors.cyan}?${colors.reset} ${colors.bright}${message}${colors.reset} ${defaultText}: `); return answer || defaultValue || ''; } /** * Display success message */ export function success(message) { console.log(`${colors.green}${colors.reset} ${message}`); } /** * Display info message */ export function info(message) { console.log(`${colors.cyan}${colors.reset} ${message}`); } /** * Display warning message */ export function warn(message) { console.log(`${colors.yellow}${colors.reset} ${message}`); } /** * Display error message */ export function error(message) { console.log(`${colors.bright}${colors.reset} ${message}`); } /** * Display welcome banner */ export function banner() { console.log(); console.log(`${colors.green}${colors.bright}╔═══════════════════════════════════════╗${colors.reset}`); console.log(`${colors.green}${colors.bright}${colors.reset} ${colors.cyan}${colors.bright}Create Rynex App${colors.reset} ${colors.green}${colors.bright}${colors.reset}`); console.log(`${colors.green}${colors.bright}╚═══════════════════════════════════════╝${colors.reset}`); console.log(); } /** * Display next steps */ export function nextSteps(projectName, useTypeScript) { console.log(); console.log(`${colors.green}${colors.bright}Success!${colors.reset} Created ${colors.cyan}${projectName}${colors.reset}`); console.log(); console.log(`${colors.bright}Next steps:${colors.reset}`); console.log(); console.log(` ${colors.gray}1.${colors.reset} ${colors.cyan}cd ${projectName}${colors.reset}`); console.log(` ${colors.gray}2.${colors.reset} ${colors.cyan}npm install${colors.reset} ${colors.dim}(or pnpm install)${colors.reset}`); console.log(` ${colors.gray}3.${colors.reset} ${colors.cyan}npm run dev${colors.reset}`); console.log(); console.log(`${colors.dim}Happy coding!${colors.reset}`); console.log(); } //# sourceMappingURL=prompts.js.map