mirror of
https://github.com/kennethreitz/bake.git
synced 2026-06-05 23:00:17 +00:00
91 lines
1.9 KiB
JavaScript
91 lines
1.9 KiB
JavaScript
'use strict';
|
|
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;
|