mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.2 KiB
123 lines
3.2 KiB
/**
|
|
* Utility functions
|
|
*/
|
|
|
|
"use strict";
|
|
var _ = require("lodash");
|
|
var chalk = require("chalk");
|
|
var rx = require("rx");
|
|
var figures = require("figures");
|
|
|
|
|
|
/**
|
|
* Module exports
|
|
*/
|
|
|
|
var utils = module.exports;
|
|
|
|
|
|
/**
|
|
* Run a function asynchronously or synchronously
|
|
* @param {Function} func Function to run
|
|
* @param {Function} cb Callback function passed the `func` returned value
|
|
* @...rest {Mixed} rest Arguments to pass to `func`
|
|
* @return {Null}
|
|
*/
|
|
|
|
utils.runAsync = function( func, cb ) {
|
|
var async = false;
|
|
var isValid = func.apply({
|
|
async: function() {
|
|
async = true;
|
|
return _.once(cb);
|
|
}
|
|
}, Array.prototype.slice.call(arguments, 2) );
|
|
|
|
if ( !async ) {
|
|
cb(isValid);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Create an oversable returning the result of a function runned in sync or async mode.
|
|
* @param {Function} func Function to run
|
|
* @return {rx.Observable} Observable emitting when value is known
|
|
*/
|
|
|
|
utils.createObservableFromAsync = function( func ) {
|
|
return rx.Observable.defer(function() {
|
|
return rx.Observable.create(function( obs ) {
|
|
utils.runAsync( func, function( value ) {
|
|
obs.onNext( value );
|
|
obs.onCompleted();
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
|
|
/**
|
|
* Resolve a question property value if it is passed as a function.
|
|
* This method will overwrite the property on the question object with the received value.
|
|
* @param {Object} question - Question object
|
|
* @param {String} prop - Property to fetch name
|
|
* @param {Object} answers - Answers object
|
|
* @...rest {Mixed} rest - Arguments to pass to `func`
|
|
* @return {rx.Obsersable} - Observable emitting once value is known
|
|
*/
|
|
|
|
utils.fetchAsyncQuestionProperty = function( question, prop, answers ) {
|
|
if ( !_.isFunction(question[prop]) ) return rx.Observable.return(question);
|
|
|
|
return utils.createObservableFromAsync(function() {
|
|
var done = this.async();
|
|
utils.runAsync( question[prop], function( value ) {
|
|
question[prop] = value;
|
|
done( question );
|
|
}, answers );
|
|
});
|
|
};
|
|
|
|
|
|
/**
|
|
* Get the pointer char
|
|
* @return {String} the pointer char
|
|
*/
|
|
|
|
utils.getPointer = function() {
|
|
return figures.pointer;
|
|
};
|
|
|
|
|
|
/**
|
|
* Get the checkbox
|
|
* @param {Boolean} checked - add a X or not to the checkbox
|
|
* @param {String} after - Text to append after the check char
|
|
* @return {String} - Composited checkbox string
|
|
*/
|
|
|
|
utils.getCheckbox = function( checked, after ) {
|
|
var checked = checked ? chalk.green( figures.radioOn ) : figures.radioOff;
|
|
return checked + " " + ( after || "" );
|
|
};
|
|
|
|
/**
|
|
* Helper for writing message in Prompt
|
|
* @param {Prompt} prompt - The Prompt object that extends tty
|
|
* @param {String} message - The message to be output
|
|
*/
|
|
utils.writeMessage = function ( prompt, message ) {
|
|
var msgLines = message.split(/\n/);
|
|
prompt.height = msgLines.length;
|
|
|
|
// Write message to screen and setPrompt to control backspace
|
|
prompt.rl.setPrompt( _.last(msgLines) );
|
|
|
|
if ( process.stdout.rows === 0 && process.stdout.columns === 0 ) {
|
|
/* When it's a tty through serial port there's no terminal info and the render will malfunction,
|
|
so we need enforce the cursor to locate to the leftmost position for rendering. */
|
|
prompt.left( message.length + prompt.rl.line.length );
|
|
}
|
|
prompt.write( message );
|
|
};
|
|
|