UNPKG

@herbsjs/herbs2repl

Version:
120 lines (99 loc) 3.56 kB
/* eslint-disable no-console */ const inquirer = require('inquirer') const chalk = require('chalk') const gradient = require('gradient-string') async function list(usecases, groupBy) { let ucs = usecases.map((uc) => { return { name: uc.tags[groupBy] + ' - ' + uc.usecase().description, value: uc.usecase } }) const answers = await inquirer .prompt([ { type: 'list', name: 'usecase', message: 'Choose a use case', choices: ucs, loop: false } ]) return answers.usecase } function printDoc(uc) { function printStep(step, level = 1, print = true) { const IF_ELSE = 'if else' const spaces = ' '.repeat(level) const bullet = chalk.grey('-') if (print) console.log(`${spaces} ${bullet} ${step.description}`) if (step.type === IF_ELSE) return printIfElseStep(step, level + 1) printSubSteps(step, level) } function printIfElseStep(step, level = 1) { const spaces = ' '.repeat(level) const style = chalk.grey const ifThenElse = [ { desc: style('if -'), step: step.if }, { desc: style('then -'), step: step.then }, { desc: style('else -'), step: step.else }, ] for (const item of ifThenElse) { console.log(`${spaces} ${item.desc} ${item.step.description}`) printStep(item.step, level + 1, false) } } function printSubSteps(step, level) { if (step.steps) for (const s of step.steps) { printStep(s, level + 1) } } const usecase = uc() const doc = usecase.doc() const style = chalk.blue.underline console.log(`\n${style(doc.description)} use case will execute the following steps:`) for (const step of doc.steps) { printStep(step) } } async function execute(usecase, user) { console.log(`\nInform the parameters for the use case execution`) const uc = usecase() const params = uc.requestSchema const questions = [] for (const param of Object.entries(params)) { const desc = param[0] const type = param[1] const questionTypes = { 'Number': 'number', 'Boolean': 'confirm', 'default': 'input', } const questionType = questionTypes[type.name] || questionTypes['default'] questions.push({ type: questionType, name: desc, message: `${desc} (${type.name})`, }) } const answers = await inquirer.prompt(questions) console.log(chalk`\n{whiteBright.bold Params:}`) console.log(chalk.blue(JSON.stringify(answers, null, ' '))) const hasAccess = await uc.authorize(user) if (!hasAccess) return console.log(chalk`\n{redBright.bold Access denied}`) const result = await uc.run(answers) console.log(chalk`\n{whiteBright.bold Result:}`) let style = result.isOk ? chalk.green : chalk.red console.log(style(JSON.stringify(result, null, ' '))) } async function repl(usecases, user, { groupBy }) { let coolGradient = gradient('gold', 'white') console.log(chalk.bold(coolGradient('\nHerbs 🌿 - Interative REPL'))) console.log(chalk.dim('press ^C to exit\n')) while (true) { const usecase = await list(usecases, groupBy) printDoc(usecase) await execute(usecase, user) console.log('') } } module.exports = repl