UNPKG

zapier-platform-cli

Version:

The CLI for apps in the Zapier Developer Platform.

281 lines (239 loc) 9.1 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 _ = require('lodash'); var colors = require('colors/safe'); var constants = require('../constants'); var qs = require('querystring'); var fs = require('fs'); var AdmZip = require('adm-zip'); var fetch = require('node-fetch'); var path = require('path'); var semver = require('semver'); var _require = require('./files'), writeFile = _require.writeFile, readFile = _require.readFile; var _require2 = require('./display'), prettyJSONstringify = _require2.prettyJSONstringify, printStarting = _require2.printStarting, printDone = _require2.printDone; var _require3 = require('./local'), localAppCommand = _require3.localAppCommand; // Reads the JSON file at ~/.zapierrc (AUTH_LOCATION). var readCredentials = function readCredentials(credentials) { var explodeIfMissing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; return Promise.resolve(credentials || readFile(constants.AUTH_LOCATION, 'Please run `zapier login`.').then(function (buf) { return JSON.parse(buf.toString()); }).catch(function (err) { if (explodeIfMissing) { throw err; } else { return {}; } })); }; // Calls the underlying platform REST API with proper authentication. var callAPI = function callAPI(route, options) { options = options || {}; var url = options.url || constants.ENDPOINT + route; var requestOptions = { method: options.method || 'GET', url: url, body: options.body ? JSON.stringify(options.body) : null, headers: { Accept: 'application/json', 'Content-Type': 'application/json; charset=utf-8', 'X-Requested-With': 'XMLHttpRequest' } }; return Promise.resolve(requestOptions).then(function (_requestOptions) { // requestOptions === _requestOptions side step for linting if (options.skipDeployKey) { return _requestOptions; } else { return readCredentials().then(function (credentials) { _requestOptions.headers['X-Deploy-Key'] = credentials.deployKey; return _requestOptions; }); } }).then(function (_requestOptions) { return fetch(_requestOptions.url, _requestOptions); }).then(function (res) { return Promise.all([res, res.text()]); }).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), res = _ref2[0], text = _ref2[1]; var errors = void 0; var hitError = res.status >= 400; if (hitError) { try { errors = JSON.parse(text).errors.join(', '); } catch (err) { errors = (text || 'Unknown error').slice(0, 250); } } if (constants.DEBUG || global.argOpts.debug) { console.log('>> ' + requestOptions.method + ' ' + requestOptions.url); if (requestOptions.body) { var cleanedBody = _.assign({}, JSON.parse(requestOptions.body), { zip_file: 'raw zip removed in logs' }); console.log('>> ' + JSON.stringify(cleanedBody)); } console.log('<< ' + res.status); console.log('<< ' + (text || '').substring(0, 2500) + '\n'); } else if (hitError) { printDone(false); } if (hitError) { throw new Error('"' + requestOptions.url + '" returned "' + res.status + '" saying "' + errors + '"'); } return JSON.parse(text); }); }; // Given a valid username and password - create a new deploy key. var createCredentials = function createCredentials(username, password) { // TODO: 2fa in the future? return callAPI('/keys', { skipDeployKey: true, method: 'POST', body: { username: username, password: password } }); }; // Reads the JSON file at ~/.zapier-platform (AUTH_LOCATION). var getLinkedAppConfig = function getLinkedAppConfig(appDir) { appDir = appDir || '.'; var file = path.resolve(appDir, constants.CURRENT_APP_FILE); return readFile(file).then(function (buf) { return JSON.parse(buf.toString()); }); }; var writeLinkedAppConfig = function writeLinkedAppConfig(app, appDir) { var file = appDir ? path.resolve(appDir, constants.CURRENT_APP_FILE) : constants.CURRENT_APP_FILE; return writeFile(file, prettyJSONstringify({ id: app.id, key: app.key })); }; // Loads the linked app from the API. var getLinkedApp = function getLinkedApp(appDir) { return getLinkedAppConfig(appDir).then(function (app) { if (!app) { return {}; } return callAPI('/apps/' + app.id); }).catch(function () { throw new Error('Warning! ' + constants.CURRENT_APP_FILE + ' seems to be incorrect. Try running `zapier link` or `zapier register`.'); }); }; // Loads the linked app version from the API var getVersionInfo = function getVersionInfo() { return Promise.all([getLinkedApp(), localAppCommand({ command: 'definition' })]).then(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), app = _ref4[0], definition = _ref4[1]; return callAPI('/apps/' + app.id + '/versions/' + definition.version); }); }; var checkCredentials = function checkCredentials() { return callAPI('/check'); }; var listApps = function listApps() { return checkCredentials().then(function () { return Promise.all([getLinkedApp().catch(function () { return undefined; }), callAPI('/apps')]); }).then(function (values) { var _values = _slicedToArray(values, 2), linkedApp = _values[0], data = _values[1]; return { app: linkedApp, apps: data.objects.map(function (app) { app.linked = linkedApp && app.id === linkedApp.id ? colors.green('✔') : ''; return app; }) }; }); }; var listEndpoint = function listEndpoint(endpoint, keyOverride) { return checkCredentials().then(function () { return getLinkedApp(); }).then(function (app) { return Promise.all([app, callAPI('/apps/' + app.id + '/' + endpoint)]); }).then(function (_ref5) { var _ref6 = _slicedToArray(_ref5, 2), app = _ref6[0], results = _ref6[1]; var out = { app: app }; out[keyOverride || endpoint] = results.objects; _.assign(out, _.omit(results, 'objects')); return out; }); }; var listVersions = function listVersions() { return listEndpoint('versions'); }; var listHistory = function listHistory() { return listEndpoint('history'); }; var listInvitees = function listInvitees() { return listEndpoint('invitees'); }; var listLogs = function listLogs(opts) { return listEndpoint('logs?' + qs.stringify(opts), 'logs'); }; var listEnv = function listEnv(version) { var endpoint = void 0; if (version) { endpoint = 'versions/' + version + '/environment'; } else { endpoint = 'environment'; } return listEndpoint(endpoint, 'environment'); }; var upload = function upload(zipPath, appDir) { zipPath = zipPath || constants.BUILD_PATH; var fullZipPath = path.resolve(appDir, zipPath); return getLinkedApp(appDir).then(function (app) { var zip = new AdmZip(fullZipPath); var definitionJson = zip.readAsText('definition.json'); if (!definitionJson) { throw new Error('definition.json in the zip was missing!'); } var definition = JSON.parse(definitionJson); var binaryZip = fs.readFileSync(fullZipPath); var buffer = new Buffer(binaryZip).toString('base64'); printStarting('Uploading version ' + definition.version); return callAPI('/apps/' + app.id + '/versions/' + definition.version, { method: 'PUT', body: { zip_file: buffer } }); }).then(function (appVersion) { printDone(); if (semver.lt(appVersion.platform_version, appVersion.core_npm_version)) { console.log('\n**NOTE:** Your app is using zapier-platform-core@' + appVersion.platform_version + ', and there\'s a new version: ' + appVersion.core_npm_version + '. Please consider updating it: https://zapier.github.io/zapier-platform-cli/#upgrading-zapier-platform-cli-or-zapier-platform-core'); } }); }; module.exports = { callAPI: callAPI, checkCredentials: checkCredentials, createCredentials: createCredentials, getLinkedApp: getLinkedApp, getLinkedAppConfig: getLinkedAppConfig, getVersionInfo: getVersionInfo, listApps: listApps, listEndpoint: listEndpoint, listEnv: listEnv, listHistory: listHistory, listInvitees: listInvitees, listLogs: listLogs, listVersions: listVersions, readCredentials: readCredentials, upload: upload, writeLinkedAppConfig: writeLinkedAppConfig };