| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | 'use strict';const ArrayPrompt = require('../types/array');const utils = require('../utils');class SelectPrompt extends ArrayPrompt {  constructor(options) {    super(options);    this.emptyError = this.options.emptyError || 'No items were selected';  }  async dispatch(s, key) {    if (this.multiple) {      return this[key.name] ? await this[key.name](s, key) : await super.dispatch(s, key);    }    this.alert();  }  separator() {    if (this.options.separator) return super.separator();    let sep = this.styles.muted(this.symbols.ellipsis);    return this.state.submitted ? super.separator() : sep;  }  pointer(choice, i) {    return (!this.multiple || this.options.pointer) ? super.pointer(choice, i) : '';  }  indicator(choice, i) {    return this.multiple ? super.indicator(choice, i) : '';  }  choiceMessage(choice, i) {    let message = this.resolve(choice.message, this.state, choice, i);    if (choice.role === 'heading' && !utils.hasColor(message)) {      message = this.styles.strong(message);    }    return this.resolve(message, this.state, choice, i);  }  choiceSeparator() {    return ':';  }  async renderChoice(choice, i) {    await this.onChoice(choice, i);    let focused = this.index === i;    let pointer = await this.pointer(choice, i);    let check = await this.indicator(choice, i) + (choice.pad || '');    let hint = await this.resolve(choice.hint, this.state, choice, i);    if (hint && !utils.hasColor(hint)) {      hint = this.styles.muted(hint);    }    let ind = this.indent(choice);    let msg = await this.choiceMessage(choice, i);    let line = () => [this.margin[3], ind + pointer + check, msg, this.margin[1], hint].filter(Boolean).join(' ');    if (choice.role === 'heading') {      return line();    }    if (choice.disabled) {      if (!utils.hasColor(msg)) {        msg = this.styles.disabled(msg);      }      return line();    }    if (focused) {      msg = this.styles.em(msg);    }    return line();  }  async renderChoices() {    if (this.state.loading === 'choices') {      return this.styles.warning('Loading choices');    }    if (this.state.submitted) return '';    let choices = this.visible.map(async(ch, i) => await this.renderChoice(ch, i));    let visible = await Promise.all(choices);    if (!visible.length) visible.push(this.styles.danger('No matching choices'));    let result = this.margin[0] + visible.join('\n');    let header;    if (this.options.choicesHeader) {      header = await this.resolve(this.options.choicesHeader, this.state);    }    return [header, result].filter(Boolean).join('\n');  }  format() {    if (!this.state.submitted || this.state.cancelled) return '';    if (Array.isArray(this.selected)) {      return this.selected.map(choice => this.styles.primary(choice.name)).join(', ');    }    return this.styles.primary(this.selected.name);  }  async render() {    let { submitted, size } = this.state;    let prompt = '';    let header = await this.header();    let prefix = await this.prefix();    let separator = await this.separator();    let message = await this.message();    if (this.options.promptLine !== false) {      prompt = [prefix, message, separator, ''].join(' ');      this.state.prompt = prompt;    }    let output = await this.format();    let help = (await this.error()) || (await this.hint());    let body = await this.renderChoices();    let footer = await this.footer();    if (output) prompt += output;    if (help && !prompt.includes(help)) prompt += ' ' + help;    if (submitted && !output && !body.trim() && this.multiple && this.emptyError != null) {      prompt += this.styles.danger(this.emptyError);    }    this.clear(size);    this.write([header, prompt, body, footer].filter(Boolean).join('\n'));    this.write(this.margin[2]);    this.restore();  }}module.exports = SelectPrompt;
 |