diff options
author | Danijel Andjelkovic <adanijel99@gmail.com> | 2022-03-01 20:21:29 +0000 |
---|---|---|
committer | Danijel Andjelkovic <adanijel99@gmail.com> | 2022-03-01 20:21:29 +0000 |
commit | 61cb1570a3410c85a4489b97c172e3a50715f36c (patch) | |
tree | 8fe4a5b77ea54bba80abc817ce2c9ef0e79e7e66 /sandbox/testAppNevena/Front/node_modules/inquirer/lib/prompts/expand.js | |
parent | 21a53d349788c99d2007cba91a923db982353b31 (diff) | |
parent | a9ee9e0a500a4a15bd0b5dcaf041f827228ed309 (diff) |
Merge branch 'researchML' into 'dev'
Research ml
See merge request igrannonica/neuronstellar!6
Diffstat (limited to 'sandbox/testAppNevena/Front/node_modules/inquirer/lib/prompts/expand.js')
-rw-r--r-- | sandbox/testAppNevena/Front/node_modules/inquirer/lib/prompts/expand.js | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/sandbox/testAppNevena/Front/node_modules/inquirer/lib/prompts/expand.js b/sandbox/testAppNevena/Front/node_modules/inquirer/lib/prompts/expand.js new file mode 100644 index 00000000..af1ad810 --- /dev/null +++ b/sandbox/testAppNevena/Front/node_modules/inquirer/lib/prompts/expand.js @@ -0,0 +1,282 @@ +'use strict'; +/** + * `rawlist` type prompt + */ + +const _ = { + uniq: require('lodash/uniq'), + isString: require('lodash/isString'), + isNumber: require('lodash/isNumber'), + findIndex: require('lodash/findIndex'), +}; +const chalk = require('chalk'); +const { map, takeUntil } = require('rxjs/operators'); +const Base = require('./base'); +const Separator = require('../objects/separator'); +const observe = require('../utils/events'); +const Paginator = require('../utils/paginator'); + +class ExpandPrompt extends Base { + constructor(questions, rl, answers) { + super(questions, rl, answers); + + if (!this.opt.choices) { + this.throwParamError('choices'); + } + + this.validateChoices(this.opt.choices); + + // Add the default `help` (/expand) option + this.opt.choices.push({ + key: 'h', + name: 'Help, list all options', + value: 'help', + }); + + this.opt.validate = (choice) => { + if (choice == null) { + return 'Please enter a valid command'; + } + + return choice !== 'help'; + }; + + // Setup the default string (capitalize the default key) + this.opt.default = this.generateChoicesString(this.opt.choices, this.opt.default); + + this.paginator = new Paginator(this.screen); + } + + /** + * Start the Inquiry session + * @param {Function} cb Callback when prompt is done + * @return {this} + */ + + _run(cb) { + this.done = cb; + + // Save user answer and update prompt to show selected option. + const events = observe(this.rl); + const validation = this.handleSubmitEvents( + events.line.pipe(map(this.getCurrentValue.bind(this))) + ); + validation.success.forEach(this.onSubmit.bind(this)); + validation.error.forEach(this.onError.bind(this)); + this.keypressObs = events.keypress + .pipe(takeUntil(validation.success)) + .forEach(this.onKeypress.bind(this)); + + // Init the prompt + this.render(); + + return this; + } + + /** + * Render the prompt to screen + * @return {ExpandPrompt} self + */ + + render(error, hint) { + let message = this.getQuestion(); + let bottomContent = ''; + + if (this.status === 'answered') { + message += chalk.cyan(this.answer); + } else if (this.status === 'expanded') { + const choicesStr = renderChoices(this.opt.choices, this.selectedKey); + message += this.paginator.paginate(choicesStr, this.selectedKey, this.opt.pageSize); + message += '\n Answer: '; + } + + message += this.rl.line; + + if (error) { + bottomContent = chalk.red('>> ') + error; + } + + if (hint) { + bottomContent = chalk.cyan('>> ') + hint; + } + + this.screen.render(message, bottomContent); + } + + getCurrentValue(input) { + if (!input) { + input = this.rawDefault; + } + + const selected = this.opt.choices.where({ key: input.toLowerCase().trim() })[0]; + if (!selected) { + return null; + } + + return selected.value; + } + + /** + * Generate the prompt choices string + * @return {String} Choices string + */ + + getChoices() { + let output = ''; + + this.opt.choices.forEach((choice) => { + output += '\n '; + + if (choice.type === 'separator') { + output += ' ' + choice; + return; + } + + let choiceStr = choice.key + ') ' + choice.name; + if (this.selectedKey === choice.key) { + choiceStr = chalk.cyan(choiceStr); + } + + output += choiceStr; + }); + + return output; + } + + onError(state) { + if (state.value === 'help') { + this.selectedKey = ''; + this.status = 'expanded'; + this.render(); + return; + } + + this.render(state.isValid); + } + + /** + * When user press `enter` key + */ + + onSubmit(state) { + this.status = 'answered'; + const choice = this.opt.choices.where({ value: state.value })[0]; + this.answer = choice.short || choice.name; + + // Re-render prompt + this.render(); + this.screen.done(); + this.done(state.value); + } + + /** + * When user press a key + */ + + onKeypress() { + this.selectedKey = this.rl.line.toLowerCase(); + const selected = this.opt.choices.where({ key: this.selectedKey })[0]; + if (this.status === 'expanded') { + this.render(); + } else { + this.render(null, selected ? selected.name : null); + } + } + + /** + * Validate the choices + * @param {Array} choices + */ + + validateChoices(choices) { + let formatError; + const errors = []; + const keymap = {}; + choices.filter(Separator.exclude).forEach((choice) => { + if (!choice.key || choice.key.length !== 1) { + formatError = true; + } + + choice.key = String(choice.key).toLowerCase(); + + if (keymap[choice.key]) { + errors.push(choice.key); + } + + keymap[choice.key] = true; + }); + + if (formatError) { + throw new Error( + 'Format error: `key` param must be a single letter and is required.' + ); + } + + if (keymap.h) { + throw new Error( + 'Reserved key error: `key` param cannot be `h` - this value is reserved.' + ); + } + + if (errors.length) { + throw new Error( + 'Duplicate key error: `key` param must be unique. Duplicates: ' + + _.uniq(errors).join(', ') + ); + } + } + + /** + * Generate a string out of the choices keys + * @param {Array} choices + * @param {Number|String} default - the choice index or name to capitalize + * @return {String} The rendered choices key string + */ + generateChoicesString(choices, defaultChoice) { + let defIndex = choices.realLength - 1; + if (_.isNumber(defaultChoice) && this.opt.choices.getChoice(defaultChoice)) { + defIndex = defaultChoice; + } else if (_.isString(defaultChoice)) { + const index = _.findIndex( + choices.realChoices, + ({ value }) => value === defaultChoice + ); + defIndex = index === -1 ? defIndex : index; + } + + const defStr = this.opt.choices.pluck('key'); + this.rawDefault = defStr[defIndex]; + defStr[defIndex] = String(defStr[defIndex]).toUpperCase(); + return defStr.join(''); + } +} + +/** + * Function for rendering checkbox choices + * @param {String} pointer Selected key + * @return {String} Rendered content + */ + +function renderChoices(choices, pointer) { + let output = ''; + + choices.forEach((choice) => { + output += '\n '; + + if (choice.type === 'separator') { + output += ' ' + choice; + return; + } + + let choiceStr = choice.key + ') ' + choice.name; + if (pointer === choice.key) { + choiceStr = chalk.cyan(choiceStr); + } + + output += choiceStr; + }); + + return output; +} + +module.exports = ExpandPrompt; |