| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 | 
							- 'use strict';
 
- const assert = require('assert');
 
- const Events = require('events');
 
- const utils = require('./lib/utils');
 
- class Enquirer extends Events {
 
-   constructor(options, answers) {
 
-     super();
 
-     this.options = utils.merge({}, options);
 
-     this.answers = { ...answers };
 
-   }
 
-   
 
-   register(type, fn) {
 
-     if (utils.isObject(type)) {
 
-       for (let key of Object.keys(type)) this.register(key, type[key]);
 
-       return this;
 
-     }
 
-     assert.equal(typeof fn, 'function', 'expected a function');
 
-     let name = type.toLowerCase();
 
-     if (fn.prototype instanceof this.Prompt) {
 
-       this.prompts[name] = fn;
 
-     } else {
 
-       this.prompts[name] = fn(this.Prompt, this);
 
-     }
 
-     return this;
 
-   }
 
-   
 
-   async prompt(questions = []) {
 
-     for (let question of [].concat(questions)) {
 
-       try {
 
-         if (typeof question === 'function') question = await question.call(this);
 
-         await this.ask(utils.merge({}, this.options, question));
 
-       } catch (err) {
 
-         return Promise.reject(err);
 
-       }
 
-     }
 
-     return this.answers;
 
-   }
 
-   async ask(question) {
 
-     if (typeof question === 'function') {
 
-       question = await question.call(this);
 
-     }
 
-     let opts = utils.merge({}, this.options, question);
 
-     let { type, name } = question;
 
-     let { set, get } = utils;
 
-     if (typeof type === 'function') {
 
-       type = await type.call(this, question, this.answers);
 
-     }
 
-     if (!type) return this.answers[name];
 
-     assert(this.prompts[type], `Prompt "${type}" is not registered`);
 
-     let prompt = new this.prompts[type](opts);
 
-     let value = get(this.answers, name);
 
-     prompt.state.answers = this.answers;
 
-     prompt.enquirer = this;
 
-     if (name) {
 
-       prompt.on('submit', value => {
 
-         this.emit('answer', name, value, prompt);
 
-         set(this.answers, name, value);
 
-       });
 
-     }
 
-     // bubble events
 
-     let emit = prompt.emit.bind(prompt);
 
-     prompt.emit = (...args) => {
 
-       this.emit.call(this, ...args);
 
-       return emit(...args);
 
-     };
 
-     this.emit('prompt', prompt, this);
 
-     if (opts.autofill && value != null) {
 
-       prompt.value = prompt.input = value;
 
-       
 
-       if (opts.autofill === 'show') {
 
-         await prompt.submit();
 
-       }
 
-     } else {
 
-       value = prompt.value = await prompt.run();
 
-     }
 
-     return value;
 
-   }
 
-   
 
-   use(plugin) {
 
-     plugin.call(this, this);
 
-     return this;
 
-   }
 
-   set Prompt(value) {
 
-     this._Prompt = value;
 
-   }
 
-   get Prompt() {
 
-     return this._Prompt || this.constructor.Prompt;
 
-   }
 
-   get prompts() {
 
-     return this.constructor.prompts;
 
-   }
 
-   static set Prompt(value) {
 
-     this._Prompt = value;
 
-   }
 
-   static get Prompt() {
 
-     return this._Prompt || require('./lib/prompt');
 
-   }
 
-   static get prompts() {
 
-     return require('./lib/prompts');
 
-   }
 
-   static get types() {
 
-     return require('./lib/types');
 
-   }
 
-   
 
-   static get prompt() {
 
-     const fn = (questions, ...rest) => {
 
-       let enquirer = new this(...rest);
 
-       let emit = enquirer.emit.bind(enquirer);
 
-       enquirer.emit = (...args) => {
 
-         fn.emit(...args);
 
-         return emit(...args);
 
-       };
 
-       return enquirer.prompt(questions);
 
-     };
 
-     utils.mixinEmitter(fn, new Events());
 
-     return fn;
 
-   }
 
- }
 
- utils.mixinEmitter(Enquirer, new Events());
 
- const prompts = Enquirer.prompts;
 
- for (let name of Object.keys(prompts)) {
 
-   let key = name.toLowerCase();
 
-   let run = options => new prompts[name](options).run();
 
-   Enquirer.prompt[key] = run;
 
-   Enquirer[key] = run;
 
-   if (!Enquirer[name]) {
 
-     Reflect.defineProperty(Enquirer, name, { get: () => prompts[name] });
 
-   }
 
- }
 
- const exp = name => {
 
-   utils.defineExport(Enquirer, name, () => Enquirer.types[name]);
 
- };
 
- exp('ArrayPrompt');
 
- exp('AuthPrompt');
 
- exp('BooleanPrompt');
 
- exp('NumberPrompt');
 
- exp('StringPrompt');
 
- module.exports = Enquirer;
 
 
  |