zapier-platform-cli
Version:
The CLI for apps in the Zapier Developer Platform.
281 lines (239 loc) • 9.1 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 _ = 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
};