.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / enquirer / lib / prompts / select.js
diff --git a/.config/coc/extensions/node_modules/coc-prettier/node_modules/enquirer/lib/prompts/select.js b/.config/coc/extensions/node_modules/coc-prettier/node_modules/enquirer/lib/prompts/select.js
new file mode 100644 (file)
index 0000000..5d3ad37
--- /dev/null
@@ -0,0 +1,139 @@
+'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;