UNPKG

easy-cli-framework

Version:

A framework for building CLI applications that are robust and easy to maintain. Supports theming, configuration files, interactive prompts, and more.

79 lines (75 loc) 2.97 kB
'use strict'; var yargsInteractive = require('yargs-interactive'); var sripeAnsi = require('strip-ansi'); // @ts-ignore Untyped Module /** * Prompts the user to select multiple choices from a list of choices, if the input is invalid, it will prompt the user again for a valid input * * @param {string} prompt The prompt to display to the user * @param {string[]} choices The choices to display to the user * @param {PromptMultipleChoiceOptions} options The options for the prompt * * @returns {Promise<string[]>} The validated choices the user selected * * @example * ```typescript * // Prompt the user to select a choice * const choices = await promptMultipleChoice('Select a choice', ['A', 'B', 'C']); * console.log(choices); * * // Prompt the user to select multiple choices with a default selection * const choices = await promptMultipleChoice('Select a choice', ['A', 'B', 'C'], { * defaultSelected: ['A', 'B'], * validator: (input) => input.length > 0, * validationErrorMessage: 'You must select at least one choice', * }); * console.log(choices); * * // Prompt the user to select a choice using a custom theme * const choices = await promptMultipleChoice('Select a choice', ['A', 'B', 'C'], { * theme: new EasyCLITheme(), * promptTheme: 'info', * }); * console.log(choices); * * // Prompt the user to select a choice using a custom displaying the choices with a theme * const theme = new EasyCLITheme(); * const choices = await promptMultipleChoice('Select a choice', [ * theme.formattedString('A', 'info'), * theme.formattedString('B', 'warn'), * theme.formattedString('C', 'error') * ]); * console.log(choices); * ``` * */ const promptMultipleChoice = async (prompt, choices, { defaultSelected = [], validator = () => true, validationErrorMessage = 'Invalid input', theme = null, promptTheme = 'default', } = {}) => { var _a; // If the options include ansii characters, we need to strip them out when comparing the defaultSelected const ansiStrippedDefaults = choices.reduce((acc, opt) => { if (defaultSelected.includes(sripeAnsi(opt))) { acc.push(opt); } return acc; }, []); while (true) { const { choice } = await yargsInteractive() .usage('$0 <command> [args]') .interactive({ interactive: { default: true }, choice: { type: 'checkbox', describe: (_a = theme === null || theme === undefined ? undefined : theme.formattedString(prompt, promptTheme)) !== null && _a !== undefined ? _a : prompt, choices, default: ansiStrippedDefaults, prompt: 'always', }, }); const clean = choice.map((opt) => sripeAnsi(opt)); if (validator(clean)) { return clean; } console.log(validationErrorMessage); } }; exports.promptMultipleChoice = promptMultipleChoice;