UNPKG

tyr-cli

Version:

A command line interface for hammer-io.

506 lines (153 loc) 45.1 kB
'use strict';Object.defineProperty(exports, "__esModule", { value: true });exports.getUserInformation = undefined; /** * Get user information based on the account provided. * * See https://docs.travis-ci.com/api/#users for information about returns. * * @param travisAccessToken the access token to get user information * @param account the account to get user information about * @param isPrivate is the project private or not * @returns {Promise} */let getUserInformation = exports.getUserInformation = (() => {var _ref = _asyncToGenerator( function* (travisAccessToken, account, isPrivate) { log.verbose('Travis Client - getUserInformation'); log.http(`GET ${getTravisApiUrl(isPrivate)}/users/${account.id} - getting user information`); return new Promise(function (resolve, reject) { _superagent2.default. get(`${getTravisApiUrl(isPrivate)}/users/${account.id}`). set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, Authorization: `token ${travisAccessToken}` }). end(function (err, res) { if (err) { log.debug(`ERROR: GET ${getTravisApiUrl(isPrivate)}/users/${account.id} - error getting user information - ${JSON.stringify({ status: err.status, message: err.message })}`); reject(filterErrorResponse(err)); } else { log.debug(`RESPONSE: GET ${getTravisApiUrl(isPrivate)}/users/${account.id} - getting user information`); resolve(res.body); } }); }); });return function getUserInformation(_x, _x2, _x3) {return _ref.apply(this, arguments);};})(); /** * Get github repo id from Travis-CI * * @param travisAccessToken the user's travis access token * @param username the username * @param projectName the project name * @param isPrivate is the project private or not * @returns {Promise} */exports.getUserAccount = getUserAccount;exports.getRepos = getRepos;exports. getRepositoryId = getRepositoryId;exports. activateTravisHook = activateTravisHook;exports. syncTravisWithGithub = syncTravisWithGithub;exports. requestTravisToken = requestTravisToken;exports. setEnvironmentVariable = setEnvironmentVariable;exports. listEnvironmentVariables = listEnvironmentVariables;exports. fetchRepository = fetchRepository;var _superagent = require('superagent');var _superagent2 = _interopRequireDefault(_superagent);var _authorization = require('../utils/authorization');var authorizationUtil = _interopRequireWildcard(_authorization);var _winston = require('../utils/winston');function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;} else {var newObj = {};if (obj != null) {for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];}}newObj.default = obj;return newObj;}}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _asyncToGenerator(fn) {return function () {var gen = fn.apply(this, arguments);return new Promise(function (resolve, reject) {function step(key, arg) {try {var info = gen[key](arg);var value = info.value;} catch (error) {reject(error);return;}if (info.done) {resolve(value);} else {return Promise.resolve(value).then(function (value) {step("next", value);}, function (err) {step("throw", err);});}}return step("next");});};}const log = (0, _winston.getActiveLogger)();const tyrAgent = 'Travis/1.0';const travisApiAccept = 'application/vnd.travis-ci.2+json'; /** * Gets the proper travis api url depending on if the project should be private or not * @param isPrivate is the project private or not * @returns {string} the private or public url */function getTravisApiUrl(isPrivate) {if (isPrivate) {return 'https://api.travis-ci.com'; // private repositories }return 'https://api.travis-ci.org'; // public repositories } /** * Filters out sensitive header information (such as authentication headers or post data) * * @param err * @returns {Error} */function filterErrorResponse(err) {if (err && err.response) {const filteredError = { status: err.response.status, text: err.response.text, req: {} };if (err.response.req) {filteredError.req = { method: err.response.req.method, url: err.response.req.url };}return new Error(JSON.stringify(filteredError));}return err;} /** * Gets the user's account based on the access token provided * * See https://docs.travis-ci.com/api/#accounts for information about returns. * * @param travisAccessToken the access token to use to get account information * @param isPrivate is the project private or not * @returns {Promise} */function getUserAccount(travisAccessToken, isPrivate) {log.verbose('Travis Client - getUserAccount()');log.http(`GET ${getTravisApiUrl(isPrivate)}/accounts/ - getting user account`);return new Promise((resolve, reject) => {_superagent2.default.get(`${getTravisApiUrl(isPrivate)}/accounts/`).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, Authorization: authorizationUtil.tokenAuthorization(travisAccessToken) }).end((err, res) => {if (err) {log.debug(`ERROR: GET ${getTravisApiUrl(isPrivate)}/accounts/ - error getting user account - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(filterErrorResponse(err));} else {log.debug(`RESPONSE: GET ${getTravisApiUrl(isPrivate)}/accounts/ - successfully got user account`);resolve(res.body);}});});} /** * Gets the repositories for a user * @param username the username to get the repostories for * @param travisAccessToken the user's access token * @param isPrivate is the project private or not * @returns {Promise<any>} */function getRepos(username, travisAccessToken, isPrivate) {log.http(`GET ${getTravisApiUrl(isPrivate)}/${username}/repos/ - getting user repositories`);return new Promise((resolve, reject) => {_superagent2.default.get(`${getTravisApiUrl(isPrivate)}/owner/${username}/repos`).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, 'Travis-Api-Version': 3, Authorization: `token ${travisAccessToken}` }).end((err, res) => {if (err) {log.debug(`ERROR: GET ${getTravisApiUrl(isPrivate)}/repos/ - error getting user repos - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(filterErrorResponse(err));} else {log.debug(`RESPONSE: GET ${getTravisApiUrl(isPrivate)}/accounts/ - successfully got user account`);resolve(res.body);}});});}function getRepositoryId(travisAccessToken, username, projectName, isPrivate) {log.verbose('Travis Client - getRepositoryId()');log.http(`GET ${getTravisApiUrl(isPrivate)}/repos/${username}/${projectName} - getting repository id for repository`);return new Promise((resolve, reject) => {_superagent2.default.get(`${getTravisApiUrl(isPrivate)}/repos/${username}/${projectName}`).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, Authorization: `token ${travisAccessToken}` }).end((err, res) => {if (err) {log.debug(`ERROR: GET ${getTravisApiUrl(isPrivate)}/repos/${username}/${projectName} - failed to get repository id for repository - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(filterErrorResponse(err));} else {log.debug(`RESPONSE: GET ${getTravisApiUrl(isPrivate)}/repos/${username}/${projectName} - successfully got repository id for repository`);resolve(res.body.repo.id);}});});} /** * Activate Travis hook on a Github repository * * @param repositoryId the repository id of the project * @param travisAccessToken the user's travis access token * @param isPrivate is the project private or not * @returns {Promise} */function activateTravisHook(repositoryId, travisAccessToken, isPrivate) {log.verbose('Travis Client - activateTravisHook()');log.http(`PUT ${getTravisApiUrl(isPrivate)}/hooks - activating travis hook on repository with id ${repositoryId}`);return new Promise((resolve, reject) => {_superagent2.default.put(`${getTravisApiUrl(isPrivate)}/hooks`).send({ hook: { id: repositoryId, active: true } }).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, Authorization: `token ${travisAccessToken}` }).end(err => {if (err) {log.debug(`PUT ${getTravisApiUrl(isPrivate)}/hooks - failed to activate travis hook on repository with id ${repositoryId} - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(filterErrorResponse(err));} else {log.debug(`PUT ${getTravisApiUrl(isPrivate)}/hooks - successfully activated travis hook on repository with id ${repositoryId}`);resolve();}});});} /** * Triggers a new sync with GitHub. Needed to see the newly-created repository * * @param travisAccessToken * @param isPrivate is the project private or not * @returns {Promise} */function syncTravisWithGithub(travisAccessToken, isPrivate) {log.verbose('Travis Client - syncTravisWithGithub()');log.http(`POST ${getTravisApiUrl(isPrivate)}/users/sync - syncing travis with github`);return new Promise((resolve, reject) => {_superagent2.default.post(`${getTravisApiUrl(isPrivate)}/users/sync`).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, Authorization: `token ${travisAccessToken}` }).end(err => {if (err) {log.debug(`ERROR: POST ${getTravisApiUrl(isPrivate)}/users/sync - error syncing travis with github - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(filterErrorResponse(err));} else {setTimeout(() => {log.debug(`RESPONSE: POST ${getTravisApiUrl(isPrivate)}/users/sync - successfully synced travis with github`);resolve();}, 10000); // TODO: Find a better way to do this than a timeout. }});});} /** * Request Travis-CI auth token * * @param githubToken tye user's github token * @param isPrivate is the project private or not * @returns {Promise} */function requestTravisToken(githubToken, isPrivate) {log.verbose('Travis Client - requestTravisToken()');log.http(`POST ${getTravisApiUrl(isPrivate)}/auth/github - getting travis token`);return new Promise((resolve, reject) => {_superagent2.default.post(`${getTravisApiUrl(isPrivate)}/auth/github`).send({ github_token: githubToken }).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept }).end((err, res) => {if (err) {log.debug(`ERROR: POST ${getTravisApiUrl(isPrivate)}/auth/github - getting travis token - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(err);} else {log.debug(`RESPONSE: POST ${getTravisApiUrl(isPrivate)}/auth/github - successfully got travis token`);resolve(res.body.access_token);}});});} /** * Set environment variables on a Travis-CI project * * @param travisAccessToken the user's travis access token * @param repoId the repository id * @param environmentVariable the environment variable to set * @param isPrivate is the project private or not * @returns {Promise} */function setEnvironmentVariable(travisAccessToken, repoId, environmentVariable, isPrivate) {log.verbose('Travis Client - setEnvironmentVariable()');log.http(`POST ${getTravisApiUrl(isPrivate)}/settings/env_vars - setting environment variables for repo with id ${repoId}`);return new Promise((resolve, reject) => {_superagent2.default.post(`${getTravisApiUrl(isPrivate)}/settings/env_vars`).query({ repository_id: repoId }).send({ env_var: environmentVariable }).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, Authorization: `token ${travisAccessToken}` }).end((err, res) => {if (err) {log.debug(`ERROR: POST ${getTravisApiUrl(isPrivate)}/settings/env_vars - setting environment variables for repo with id ${repoId} - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(filterErrorResponse(err));} else {log.debug(`RESPONSE: POST ${getTravisApiUrl(isPrivate)}/settings/env_vars - successfully set environment variables for repo with id ${repoId}`);resolve(res.body.env_var);}});});} /** * Lists environment variables for a repository that's been enabled in TravisCI. * * @param travisAccessToken the user's travis access token * @param repoId the repository id * @param isPrivate is the project private or not * @returns Promise (example shown below) * [ * { * "id": "018e66f2-cd3a-4295-aa1d-018fe9aa0fb4", * "name": "example", * "value": "foobar", * "public": true, * "repository_id": 124920 * }, * { * "id": "ec9423da-9658-4cd6-b282-fd0e5f6ed2df", * "name": "secret_example", * "public": false, * "repository_id": 124920 * } * ] */function listEnvironmentVariables(travisAccessToken, repoId, isPrivate) {log.verbose('Travis Client - listEnvironmentVariables()');log.http(`GET ${getTravisApiUrl(isPrivate)}/settings/env_vars - getting environment variables for repo with id ${repoId}`);return new Promise((resolve, reject) => {_superagent2.default.get(`${getTravisApiUrl(isPrivate)}/settings/env_vars`).query({ repository_id: repoId }).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, Authorization: `token ${travisAccessToken}` }).end((err, res) => {if (err) {log.debug(`ERROR: GET ${getTravisApiUrl(isPrivate)}/settings/env_vars - error getting environment variables for repo with id ${repoId} - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(filterErrorResponse(err));} else {log.debug(`RESPONSE: GET ${getTravisApiUrl(isPrivate)}/settings/env_vars - error getting environment variables for repo with id ${repoId}`);resolve(res.body.env_vars);}});});} /** * Fetch information for a given repository * * @param travisAccessToken the user's travis access token * @param username the username * @param repositoryName the name of the repository * @param isPrivate is the project private or not * @returns Promise (example shown below) * { * "id": 82, * "slug": "sinatra/sinatra", * "description": "Classy web-development dressed in a DSL", * "last_build_id": 23436881, * "last_build_number": "792", * "last_build_state": "passed", * "last_build_duration": 2542, * "last_build_started_at": "2014-04-21T15:27:14Z", * "last_build_finished_at": "2014-04-21T15:40:04Z", * "active": "true" * } */function fetchRepository(travisAccessToken, username, repositoryName, isPrivate) {const repoSlug = `${username}/${repositoryName}`;log.debug('fetchRepository', repoSlug);log.http(`GET ${getTravisApiUrl(isPrivate)}/repos/${repoSlug} - getting repository information on TravisCI`);return new Promise((resolve, reject) => {_superagent2.default.get(`${getTravisApiUrl(isPrivate)}/repos/${repoSlug}`).set({ 'User-Agent': tyrAgent, Accept: travisApiAccept, Authorization: `token ${travisAccessToken}` }).end((err, res) => {if (err) {log.debug(`ERROR: GET ${getTravisApiUrl(isPrivate)}/repos/${repoSlug} - error getting repository information on TravisCI - ${JSON.stringify({ status: err.status, message: err.message })}`);reject(filterErrorResponse(err));} else if (!res.body.repo) {reject(new Error(`Unable to find the repository '${repoSlug}'!`));} else {log.debug(`RESPONSE: GET ${getTravisApiUrl(isPrivate)}/repos/${repoSlug} - success getting repository information on TravisCI`);resolve(res.body.repo);}});});}