diff options
author | Michaël Zasso <targos@protonmail.com> | 2017-12-22 16:53:42 +0100 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2018-01-11 09:48:05 +0100 |
commit | 3dc30632755713179f345f4af024bd904c6162d0 (patch) | |
tree | f28c4f6dd6dfc5992edf301449d1a371d229755b /tools/node_modules/eslint/node_modules/inquirer/lib/ui/prompt.js | |
parent | a2c7085dd4a8e60d1a47572aca8bb6fcb7a32f88 (diff) | |
download | android-node-v8-3dc30632755713179f345f4af024bd904c6162d0.tar.gz android-node-v8-3dc30632755713179f345f4af024bd904c6162d0.tar.bz2 android-node-v8-3dc30632755713179f345f4af024bd904c6162d0.zip |
tools: move eslint from tools to tools/node_modules
This is required because we need to add the babel-eslint dependency
and it has to be able to resolve "eslint".
babel-eslint is required to support future ES features such as async
iterators and import.meta.
Refs: https://github.com/nodejs/node/pull/17755
PR-URL: https://github.com/nodejs/node/pull/17820
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Diffstat (limited to 'tools/node_modules/eslint/node_modules/inquirer/lib/ui/prompt.js')
-rw-r--r-- | tools/node_modules/eslint/node_modules/inquirer/lib/ui/prompt.js | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/tools/node_modules/eslint/node_modules/inquirer/lib/ui/prompt.js b/tools/node_modules/eslint/node_modules/inquirer/lib/ui/prompt.js new file mode 100644 index 0000000000..9b56fe4dfe --- /dev/null +++ b/tools/node_modules/eslint/node_modules/inquirer/lib/ui/prompt.js @@ -0,0 +1,115 @@ +'use strict'; +var _ = require('lodash'); +var rx = require('rx-lite-aggregates'); +var util = require('util'); +var runAsync = require('run-async'); +var utils = require('../utils/utils'); +var Base = require('./baseUI'); + +/** + * Base interface class other can inherits from + */ + +var PromptUI = module.exports = function (prompts, opt) { + Base.call(this, opt); + this.prompts = prompts; +}; +util.inherits(PromptUI, Base); + +PromptUI.prototype.run = function (questions) { + // Keep global reference to the answers + this.answers = {}; + + // Make sure questions is an array. + if (_.isPlainObject(questions)) { + questions = [questions]; + } + + // Create an observable, unless we received one as parameter. + // Note: As this is a public interface, we cannot do an instanceof check as we won't + // be using the exact same object in memory. + var obs = _.isArray(questions) ? rx.Observable.from(questions) : questions; + + this.process = obs + .concatMap(this.processQuestion.bind(this)) + // `publish` creates a hot Observable. It prevents duplicating prompts. + .publish(); + + this.process.connect(); + + return this.process + .reduce(function (answers, answer) { + _.set(this.answers, answer.name, answer.answer); + return this.answers; + }.bind(this), {}) + .toPromise(Promise) + .then(this.onCompletion.bind(this)); +}; + +/** + * Once all prompt are over + */ + +PromptUI.prototype.onCompletion = function (answers) { + this.close(); + + return answers; +}; + +PromptUI.prototype.processQuestion = function (question) { + question = _.clone(question); + return rx.Observable.defer(function () { + var obs = rx.Observable.of(question); + + return obs + .concatMap(this.setDefaultType.bind(this)) + .concatMap(this.filterIfRunnable.bind(this)) + .concatMap(utils.fetchAsyncQuestionProperty.bind(null, question, 'message', this.answers)) + .concatMap(utils.fetchAsyncQuestionProperty.bind(null, question, 'default', this.answers)) + .concatMap(utils.fetchAsyncQuestionProperty.bind(null, question, 'choices', this.answers)) + .concatMap(this.fetchAnswer.bind(this)); + }.bind(this)); +}; + +PromptUI.prototype.fetchAnswer = function (question) { + var Prompt = this.prompts[question.type]; + this.activePrompt = new Prompt(question, this.rl, this.answers); + return rx.Observable.defer(function () { + return rx.Observable.fromPromise(this.activePrompt.run().then(function (answer) { + return {name: question.name, answer: answer}; + })); + }.bind(this)); +}; + +PromptUI.prototype.setDefaultType = function (question) { + // Default type to input + if (!this.prompts[question.type]) { + question.type = 'input'; + } + return rx.Observable.defer(function () { + return rx.Observable.return(question); + }); +}; + +PromptUI.prototype.filterIfRunnable = function (question) { + if (question.when === false) { + return rx.Observable.empty(); + } + + if (!_.isFunction(question.when)) { + return rx.Observable.return(question); + } + + var answers = this.answers; + return rx.Observable.defer(function () { + return rx.Observable.fromPromise( + runAsync(question.when)(answers).then(function (shouldRun) { + if (shouldRun) { + return question; + } + }) + ).filter(function (val) { + return val != null; + }); + }); +}; |