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
JavaScript
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
};
}