@lenne.tech/gluegun-menu
Version:
Menu for gluegun CLIs
171 lines • 13.7 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Menu = void 0;
/**
* Menu for gluegun
*/
class Menu {
/**
* Constructor for integration of toolbox
*/
constructor(toolbox) {
this.toolbox = toolbox;
this.optionsCache = {};
}
/**
* Show menu
*/
showMenu(parentCommands, options) {
return __awaiter(this, void 0, void 0, function* () {
if (options
&& options.setCache
&& (!!options.showHelp
|| !!options.helpLabel
|| !!options.backLabel
|| !!options.cancelLabel
|| !!options.byeMessage
|| !!options.hideBack)) {
// save everything except level, headline & setCache
this.optionsCache = Object.assign({}, options);
delete this.optionsCache.level;
delete this.optionsCache.headline;
delete this.optionsCache.setCache;
}
options = Object.assign(Object.assign({}, this.optionsCache), options);
const messages = {
back: options.backLabel || '[ back ]',
bye: options.byeMessage || 'Take care 👋',
cancel: options.cancelLabel || '[ cancel ]',
help: options.helpLabel || '[ help ]',
};
// Toolbox feature
const { print, prompt, runtime: { brand, commands }, } = this.toolbox;
// Prepare parent command
parentCommands = parentCommands ? parentCommands.trim() : '';
// Process options
const { headline, level } = Object.assign({
headline: parentCommands ? `${parentCommands.charAt(0).toUpperCase() + parentCommands.slice(1)} commands` : '',
level: parentCommands ? parentCommands.split(' ').length : 0,
}, options);
// Headline
if (headline) {
print.info(print.colors.cyan(headline));
}
// Get main commands
let mainCommands = commands
.filter((c) =>
// Get only children of current command
c.commandPath.join(' ').startsWith(parentCommands)
// Get only direct children of current command
&& c.commandPath.length === level + 1
// Help will be added as additional command
&& !['help'].includes(c.commandPath[0])
// Don't show CLI brand command
&& !(level === 0 && [brand].includes(c.commandPath[0])))
.map(c => c.commandPath[level] + (c.description ? ` (${c.description})` : ''))
.sort();
// Additional commands
if (options.showHelp !== false) {
mainCommands = [messages.help].concat(mainCommands);
}
if (level && options.hideBack !== true) {
mainCommands.push(messages.back);
}
mainCommands.push(messages.cancel);
// Select command
const { commandName } = yield prompt.ask({
choices: mainCommands.slice(0),
message: 'Select command',
name: 'commandName',
type: 'select',
});
// Check command
if (!commandName) {
print.error('No command selected!');
return;
}
switch (commandName) {
case messages.back: {
// Get command
let command = commands.filter((c) => c.commandPath.join(' ')
=== parentCommands
.trim()
.replace(/\s\(.*\)$/, '')
.split(' ')
.slice(0, -1)
.join(' '))[0];
if (!command) {
command = commands[0];
}
// Run command
try {
this.toolbox.parameters.options.fromGluegunMenu = true;
yield command.run(this.toolbox);
process.exit();
}
catch (e) {
// Abort via CTRL-C
if (!e) {
console.log(messages.bye);
}
else {
// Throw error
throw e;
}
}
break;
}
case messages.cancel: {
print.info(messages.bye);
return;
}
case messages.help: {
print.printCommands(this.toolbox, level ? parentCommands.split(' ') : undefined);
break;
}
default: {
// Get command
const command = commands.filter((c) => c.commandPath.join(' ') === `${parentCommands} ${commandName}`.trim().replace(/\s\(.*\)$/, ''))[0];
// Run command
try {
this.toolbox.parameters.options.fromGluegunMenu = true;
yield command.run(this.toolbox);
process.exit();
}
catch (e) {
// Abort via CTRL-C
if (!e) {
console.log(messages.bye);
}
else {
// Throw error
throw e;
}
}
}
}
});
}
}
exports.Menu = Menu;
/**
* Extend toolbox
*/
exports.default = (toolbox) => {
// Add menu
toolbox.menu = new Menu(toolbox);
// Add the function to query whether the command was started from the menu
toolbox.fromMenu = () => {
return toolbox.parameters.options.fromGluegunMenu;
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXh0ZW5zaW9ucy9tZW51LmV4dGVuc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQTs7R0FFRztBQUNILE1BQWEsSUFBSTtJQUVmOztPQUVHO0lBQ0gsWUFBc0IsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ1UsUUFBUSxDQUNuQixjQUF1QixFQUN2QixPQVVDOztZQUVELElBQ0UsT0FBTzttQkFDSixPQUFPLENBQUMsUUFBUTttQkFDaEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVE7dUJBQ2pCLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUzt1QkFDbkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTO3VCQUNuQixDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVc7dUJBQ3JCLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVTt1QkFDcEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFDeEIsQ0FBQztnQkFDRCxvREFBb0Q7Z0JBQ3BELElBQUksQ0FBQyxZQUFZLHFCQUFRLE9BQU8sQ0FBRSxDQUFDO2dCQUNuQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUMvQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUNsQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQ3BDLENBQUM7WUFFRCxPQUFPLG1DQUNGLElBQUksQ0FBQyxZQUFZLEdBQ2pCLE9BQU8sQ0FDWCxDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksVUFBVTtnQkFDckMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxV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