UNPKG

modurize

Version:

Intelligent CLI tool to scaffold dynamic, context-aware modules for Node.js apps with smart CRUD generation and database integration

96 lines (81 loc) 2.7 kB
import readline from 'readline'; export async function promptUser(question, defaultValue = '') { const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); return new Promise((resolve) => { const promptText = defaultValue ? `${question} (${defaultValue}): ` : `${question}: `; rl.question(promptText, (answer) => { rl.close(); resolve(answer || defaultValue); }); }); } export async function promptChoice(question, choices, defaultValue = 0) { const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); console.log(`\n${question}`); choices.forEach((choice, index) => { const marker = index === defaultValue ? '→' : ' '; console.log(` ${marker} ${index + 1}. ${choice}`); }); return new Promise((resolve) => { rl.question(`\nSelect (1-${choices.length}): `, (answer) => { rl.close(); const selection = parseInt(answer) - 1; if (selection >= 0 && selection < choices.length) { resolve(selection); } else { resolve(defaultValue); } }); }); } export async function promptConfirm(question, defaultValue = true) { const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const defaultText = defaultValue ? 'Y/n' : 'y/N'; const promptText = `${question} (${defaultText}): `; return new Promise((resolve) => { rl.question(promptText, (answer) => { rl.close(); const lowerAnswer = answer.toLowerCase(); if (lowerAnswer === 'y' || lowerAnswer === 'yes') { resolve(true); } else if (lowerAnswer === 'n' || lowerAnswer === 'no') { resolve(false); } else { resolve(defaultValue); } }); }); } export async function interactiveSetup() { console.log('🎯 Interactive Module Setup\n'); const moduleName = await promptUser('Module name'); if (!moduleName) { console.error('❌ Module name is required'); process.exit(1); } const styleChoices = ['Function-based (default)', 'Class-based']; const styleIndex = await promptChoice('Choose coding style:', styleChoices); const useClass = styleIndex === 1; const outputDir = await promptUser('Output directory', 'src/modules'); const confirm = await promptConfirm( `Generate ${useClass ? 'class-based' : 'function-based'} module '${moduleName}' in '${outputDir}'?` ); if (!confirm) { console.log('❌ Cancelled'); process.exit(0); } return { moduleName: moduleName.toLowerCase(), useClass, outputDir }; }