Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / inquirer / lib / prompts / password.js
1 'use strict';
2 /**
3  * `password` type prompt
4  */
5
6 var chalk = require('chalk');
7 var { map, takeUntil } = require('rxjs/operators');
8 var Base = require('./base');
9 var observe = require('../utils/events');
10
11 function mask(input, maskChar) {
12   input = String(input);
13   maskChar = typeof maskChar === 'string' ? maskChar : '*';
14   if (input.length === 0) {
15     return '';
16   }
17
18   return new Array(input.length + 1).join(maskChar);
19 }
20
21 class PasswordPrompt extends Base {
22   /**
23    * Start the Inquiry session
24    * @param  {Function} cb      Callback when prompt is done
25    * @return {this}
26    */
27
28   _run(cb) {
29     this.done = cb;
30
31     var events = observe(this.rl);
32
33     // Once user confirm (enter key)
34     var submit = events.line.pipe(map(this.filterInput.bind(this)));
35
36     var validation = this.handleSubmitEvents(submit);
37     validation.success.forEach(this.onEnd.bind(this));
38     validation.error.forEach(this.onError.bind(this));
39
40     events.keypress
41       .pipe(takeUntil(validation.success))
42       .forEach(this.onKeypress.bind(this));
43
44     // Init
45     this.render();
46
47     return this;
48   }
49
50   /**
51    * Render the prompt to screen
52    * @return {PasswordPrompt} self
53    */
54
55   render(error) {
56     var message = this.getQuestion();
57     var bottomContent = '';
58
59     if (this.status === 'answered') {
60       message += this.opt.mask
61         ? chalk.cyan(mask(this.answer, this.opt.mask))
62         : chalk.italic.dim('[hidden]');
63     } else if (this.opt.mask) {
64       message += mask(this.rl.line || '', this.opt.mask);
65     } else {
66       message += chalk.italic.dim('[input is hidden] ');
67     }
68
69     if (error) {
70       bottomContent = '\n' + chalk.red('>> ') + error;
71     }
72
73     this.screen.render(message, bottomContent);
74   }
75
76   /**
77    * When user press `enter` key
78    */
79
80   filterInput(input) {
81     if (!input) {
82       return this.opt.default == null ? '' : this.opt.default;
83     }
84
85     return input;
86   }
87
88   onEnd(state) {
89     this.status = 'answered';
90     this.answer = state.value;
91
92     // Re-render prompt
93     this.render();
94
95     this.screen.done();
96     this.done(state.value);
97   }
98
99   onError(state) {
100     this.render(state.isValid);
101   }
102
103   onKeypress() {
104     // If user press a key, just clear the default value
105     if (this.opt.default) {
106       this.opt.default = undefined;
107     }
108
109     this.render();
110   }
111 }
112
113 module.exports = PasswordPrompt;