zapier-platform-cli
Version:
The CLI for apps in the Zapier Developer Platform.
365 lines (304 loc) • 10.7 kB
JavaScript
;
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var readline = require('readline');
var _require = require('./misc'),
isWindows = _require.isWindows;
// could we explore https://www.npmjs.com/package/columnify
// to simplify the columns/tables? the | - decoration is big
var Table = require('cli-table2');
var colors = require('colors/safe');
var stringLength = require('string-length');
var _ = require('lodash');
var read = require('read');
var notUndef = function notUndef(s) {
return String(s === undefined ? '' : s).trim();
};
var unBacktick = function unBacktick(s) {
return s.replace(/\n?`+(bash)?/g, '');
};
var prettyJSONstringify = function prettyJSONstringify(obj) {
return JSON.stringify(obj, null, ' ');
};
var markdownLog = function markdownLog(str) {
// turn markdown into something with styles and stuff
// https://blog.mariusschulz.com/content/images/sublime_markdown_with_syntax_highlighting.png
console.log(unBacktick(str));
};
// Convert rows from keys to column labels.
var rewriteLabels = function rewriteLabels(rows, columnDefs) {
return rows.map(function (row) {
var consumptionRow = {};
columnDefs.forEach(function (columnDef) {
var _columnDef = _slicedToArray(columnDef, 3),
label = _columnDef[0],
key = _columnDef[1],
_default = _columnDef[2];
var val = _.get(row, key || label, _default);
consumptionRow[label] = notUndef(val);
});
return consumptionRow;
});
};
var makePlainSingle = function makePlainSingle(row) {
return _.map(row, function (value, key) {
return (colors.grey('==') + ' ' + colors.bold(key) + '\n' + value).trim();
}).join('\n');
};
// An easier way to print rows for copy paste accessibility.
var makePlain = function makePlain(rows, columnDefs) {
return rewriteLabels(rows, columnDefs).map(makePlainSingle).join(colors.grey('\n\n - - - - - - - - - - - - - - - - - - \n\n')) + '\n';
};
var isTooWideForWindow = function isTooWideForWindow(str) {
var widestRow = str.split('\n').reduce(function (coll, row) {
if (stringLength(row) > coll) {
return stringLength(row);
} else {
return coll;
}
}, 0);
return widestRow > process.stdout.columns;
};
var ansiTrim = function ansiTrim(s) {
return _.trim(s, ['\r', '\n', ' ']
// '\u001b[39m',
// '\u001b[90m',
);
};
var CHARS = {
// 'top': '', 'top-mid': '', 'top-left': '', 'top-right': '',
// 'bottom': ' ', 'bottom-mid': ' ', 'bottom-left': ' ', 'bottom-right': ' '
};
// Similar to makeTable, but prints the column headings in the left-hand column
// and the values in the right-hand column, in rows
var makeRowBasedTable = function makeRowBasedTable(rows, columnDefs) {
var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
_ref$includeIndex = _ref.includeIndex,
includeIndex = _ref$includeIndex === undefined ? true : _ref$includeIndex;
var tableOptions = {
chars: CHARS,
style: {
compact: true
}
};
var table = new Table(tableOptions);
var maxLabelLength = _.reduce(columnDefs, function (maxLength, columnDef) {
if (columnDef[0] && stringLength(columnDef[0]) > maxLength) {
return stringLength(columnDef[0]);
}
return maxLength;
}, 1);
var widthForValue = process.stdout.columns - maxLabelLength - 15; // The last bit accounts for some padding and borders
rows.forEach(function (row, index) {
if (includeIndex) {
table.push([{ colSpan: 2, content: colors.grey('= ' + (index + 1) + ' =') }]);
}
columnDefs.forEach(function (columnDef) {
var consumptionRow = {};
var _columnDef2 = _slicedToArray(columnDef, 3),
label = _columnDef2[0],
key = _columnDef2[1],
_default = _columnDef2[2];
var val = _.get(row, key || label, _default);
val = notUndef(val);
if (stringLength(val) > widthForValue) {
try {
val = prettyJSONstringify(JSON.parse(val));
} catch (err) {
// Wasn't JSON, so splice in newlines so that word wraping works properly
var rest = val;
val = '';
while (stringLength(rest) > 0) {
val += rest.slice(0, widthForValue);
if (val.indexOf('\n') === -1) {
val += '\n';
}
rest = rest.slice(widthForValue);
}
}
}
var colLabel = ' ' + colors.bold(label);
if (!includeIndex) {
colLabel = colors.bold(label) + ' ';
}
consumptionRow[colLabel] = val.trim();
table.push(consumptionRow);
});
if (index < rows.length - 1) {
table.push([{ colSpan: 2, content: ' ' }]);
}
});
var strTable = ansiTrim(table.toString());
if (isTooWideForWindow(strTable)) {
return makePlain(rows, columnDefs);
}
return strTable;
};
// Wraps the cli-table2 library. Rows is an array of objects, columnDefs
// an ordered sub-array [[label, key, (optional_default)], ...].
var makeTable = function makeTable(rows, columnDefs) {
var tableOptions = {
head: columnDefs.map(function (_ref2) {
var _ref3 = _slicedToArray(_ref2, 1),
label = _ref3[0];
return label;
}),
chars: CHARS,
style: {
compact: true,
head: ['bold']
}
};
var table = new Table(tableOptions);
rows.forEach(function (row) {
var consumptionRow = [];
columnDefs.forEach(function (columnDef) {
var _columnDef3 = _slicedToArray(columnDef, 3),
label = _columnDef3[0],
key = _columnDef3[1],
_default = _columnDef3[2];
var val = _.get(row, key || label, _default);
consumptionRow.push(notUndef(val));
});
table.push(consumptionRow);
});
var strTable = ansiTrim(table.toString());
if (isTooWideForWindow(strTable)) {
return makeRowBasedTable(rows, columnDefs, { includeIndex: false });
}
return strTable;
};
var makeJSON = function makeJSON(rows, columnDefs) {
return prettyJSONstringify(rewriteLabels(rows, columnDefs));
};
var makeRawJSON = function makeRawJSON(rows) {
return prettyJSONstringify(rows);
};
var makeSmall = function makeSmall(rows) {
var longestRow = _.max(rows.map(function (r) {
return r.name.length;
}));
var res = [];
rows.forEach(function (row) {
res.push(' ' + row.name + ' '.repeat(longestRow - row.name.length + 1) + ' # ' + row.help);
});
return res.join('\n');
};
var DEFAULT_STYLE = 'table';
var formatStyles = {
plain: makePlain,
json: makeJSON,
raw: makeRawJSON,
row: makeRowBasedTable,
table: makeTable,
small: makeSmall
};
var printData = function printData(rows, columnDefs) {
var ifEmptyMessage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
var useRowBasedTable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
var formatStyle = (global.argOpts || {}).format || (useRowBasedTable ? 'row' : DEFAULT_STYLE);
var formatter = formatStyles[formatStyle] || formatStyles[DEFAULT_STYLE];
if (rows && !rows.length) {
console.log(ifEmptyMessage);
} else {
console.log(formatter(rows, columnDefs));
}
};
var spinner = void 0;
var currentIter = 0;
var spinSpeed = void 0;
var spinTransitions = void 0;
if (isWindows()) {
spinSpeed = 240;
spinTransitions = [' ', '. ', '.. ', '...'];
} else {
spinSpeed = 80;
spinTransitions = ['⠃', '⠉', '⠘', '⠰', '⠤', '⠆'];
}
var finalTransition = spinTransitions[0];
var clearSpinner = function clearSpinner() {
process.stdout.write('\x1b[?25h'); // set cursor to white...
clearInterval(spinner);
spinner = undefined;
};
var writeNextSpinnerTick = function writeNextSpinnerTick() {
var final = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var _finalTransition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : finalTransition;
readline.moveCursor(process.stdout, -spinTransitions[currentIter].length, 0);
currentIter++;
if (currentIter >= spinTransitions.length) {
currentIter = 0;
}
process.stdout.write(final ? _finalTransition : spinTransitions[currentIter]);
};
var startSpinner = function startSpinner() {
process.stdout.write(spinTransitions[currentIter]);
clearSpinner();
process.stdout.write('\x1b[?25l'); // set cursor to black...
spinner = setInterval(function () {
writeNextSpinnerTick();
}, spinSpeed);
};
var endSpinner = function endSpinner(_finalTransition) {
if (!spinner) {
return;
}
clearSpinner();
writeNextSpinnerTick(true, _finalTransition);
};
var printStarting = function printStarting(msg) {
if (spinner) {
return;
}
if (msg) {
msg = ' ' + msg + ' ';
} else {
msg = '';
}
process.stdout.write(msg);
startSpinner();
};
var printDone = function printDone() {
var success = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
var message = arguments[1];
if (!spinner) {
return;
}
endSpinner();
if (message) {
message = ' ' + message;
}
var logMsg = success ? colors.green(message || ' done!') : colors.red(message || ' fail!');
console.log(logMsg);
};
// Get input from a user.
var getInput = function getInput(question) {
var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref4$secret = _ref4.secret,
secret = _ref4$secret === undefined ? false : _ref4$secret;
return new Promise(function (resolve, reject) {
read({
prompt: question,
silent: secret,
replace: secret ? '*' : undefined
}, function (err, result) {
if (err) {
reject(err);
}
resolve(result);
});
});
};
module.exports = {
clearSpinner: clearSpinner,
endSpinner: endSpinner,
formatStyles: formatStyles,
getInput: getInput,
makeRowBasedTable: makeRowBasedTable,
makeTable: makeTable,
markdownLog: markdownLog,
prettyJSONstringify: prettyJSONstringify,
printData: printData,
printDone: printDone,
printStarting: printStarting,
startSpinner: startSpinner
};