@cuba-platform/front-generator
Version:
CUBA Platform front-end clients generator
91 lines (78 loc) • 1.92 kB
JavaScript
;
const _ = require('lodash');
const inquirer = require('inquirer');
const diff = require('diff');
const chalk = require('chalk');
const logger = require('./util/log');
/**
* `TerminalAdapter` is the default implementation of `Adapter`, an abstraction
* layer that defines the I/O interactions.
*
* It provides a CLI interaction
*
* @constructor
*/
class TerminalAdapter {
constructor() {
this.promptModule = inquirer.createPromptModule();
}
get _colorDiffAdded() {
return chalk.black.bgGreen;
}
get _colorDiffRemoved() {
return chalk.bgRed;
}
_colorLines(name, str) {
return str.split('\n').map(line => this[`_colorDiff${name}`](line)).join('\n');
}
/**
* Prompt a user for one or more questions and pass
* the answer(s) to the provided callback.
*
* It shares its interface with `Base.prompt`
*
* (Defined inside the constructor to keep interfaces separated between
* instances)
*
* @param {Array} questions
* @param {Function} callback
*/
prompt(questions, cb) {
const promise = this.promptModule(questions);
promise.then(cb || _.noop);
return promise;
}
/**
* Shows a color-based diff of two strings
*
* @param {string} actual
* @param {string} expected
*/
diff(actual, expected) {
let msg = diff.diffLines(actual, expected).map(str => {
if (str.added) {
return this._colorLines('Added', str.value);
}
if (str.removed) {
return this._colorLines('Removed', str.value);
}
return str.value;
}).join('');
// Legend
msg = '\n' +
this._colorDiffRemoved('removed') +
' ' +
this._colorDiffAdded('added') +
'\n\n' +
msg +
'\n';
console.log(msg);
return msg;
}
}
/**
* Logging utility
* @type {env/log}
*/
TerminalAdapter.prototype.log = logger();
module.exports = TerminalAdapter;