UNPKG

zapier-platform-cli

Version:

The CLI for apps in the Zapier Developer Platform.

365 lines (304 loc) 10.7 kB
'use strict'; 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 };