genie-uml
Version:
UML support for JHipster via XMI files
166 lines (155 loc) • 3.7 kB
JavaScript
const inquirer = require('inquirer'),
deasync = require('deasync'),
merge = require('../utils/object_utils').merge;
module.exports = {
askConfirmation: askConfirmation,
selectMultipleChoices: selectMultipleChoices,
selectSingleChoice: selectSingleChoice,
askForInput: askForInput
};
const DEFAULTS = {
QUESTION_TYPES: {
CHECKBOX: 'checkbox',
LIST: 'list',
CONFIRM: 'confirm',
INPUT: 'input'
},
CONFIRMATIONS: {
question: 'Confirm?',
'default': true
},
SINGLE_CHOICES: {
name: 'answer',
question: 'Choose one among:'
},
MULTIPLE_CHOICES: {
name: 'answer',
question: 'Choose as many as you want among:'
},
INPUT: {
question: 'Enter the value:'
},
NOTHING: []
};
/**
* Asks the user for an input.
* @param args {object} keys: question
* @return {string} the user's answer.
*/
function askForInput(args) {
var userAnswer = null;
var merged = merge(DEFAULTS.INPUT, args);
inquirer.prompt([
{
type: DEFAULTS.QUESTION_TYPES.INPUT,
name: 'value',
message: merged.question,
validate: function(value) {
var pass = value.match(/^[A-z0-9-_]+$/);
if (pass) {
return true;
}
return "The passed value is invalid, only alphabetical characters, '-' and '_' are allowed.";
}
}
]
).then(function (answer) {
userAnswer = answer.value;
});
while (!userAnswer) {
wait(100);
}
return userAnswer;
}
/**
* Asks the user for confirmation.
* @param args {object} keys: question, defaultValue
* @return {boolean} the user's answer.
*/
function askConfirmation(args) {
var userAnswer = 'no-answer';
var merged = merge(DEFAULTS.CONFIRMATIONS, args);
inquirer.prompt([
{
type: DEFAULTS.QUESTION_TYPES.CONFIRM,
name: 'choice',
message: merged.question,
'default': merged.defaultValue
}
]
).then(function (answer) {
userAnswer = answer.choice;
});
while (userAnswer === 'no-answer') {
wait(100);
}
return userAnswer;
}
/**
* Asks the user for a choice.
* @param args {object} keys: classes, choices, question, filterFunction
* @return the choice.
*/
function selectSingleChoice(args) {
args.choices = args.choices || prepareChoices(args.classes);
var merged = merge(DEFAULTS.SINGLE_CHOICES, args);
var result = null;
inquirer.prompt([
{
type: DEFAULTS.QUESTION_TYPES.LIST,
name: 'answer',
message: merged.question,
choices: merged.choices,
filter: merged.filterFunction
}
]).then(function(answers) {
result = answers.answer;
});
while (!result) {
wait(100);
}
return result;
}
/**
* Asks the user for one, or more choices.
* @param args {object} keys: classes, choices, question, filterFunction
* @return the choice.
*/
function selectMultipleChoices(args) {
args.choices = args.choices || prepareChoices(args.classes);
var merged = merge(DEFAULTS.MULTIPLE_CHOICES, args);
var result = null;
inquirer.prompt([
{
type: DEFAULTS.QUESTION_TYPES.CHECKBOX,
name: 'answer',
message: merged.question,
choices: merged.choices,
filter: merged.filterFunction
}
]).then(function(answers) {
if (answers.answer.toString().length === 0) {
result = DEFAULTS.NOTHING;
} else {
result = answers.answer;
}
});
while (!result) {
wait(100);
}
return result;
}
function prepareChoices(classes) {
var choices = [];
for (let classId in classes) {
choices.push(classes[classId].name);
}
return choices;
}
function defaultFilterFunction(value) {
return value;
}
function wait(time) {
deasync.sleep(time);
}
;