Skip to content
Snippets Groups Projects
github.js 1.80 KiB
const ghGot = require('../platform/github/gh-got-wrapper');
const versioning = require('../versioning');

const { isVersion } = versioning('semver');

module.exports = {
  getDependency,
};

async function getDependency(repo, options = {}) {
  let versions;
  let endpoint;
  let token;
  // istanbul ignore if
  if (process.env.GITHUB_ENDPOINT) {
    logger.debug('Removing GHE token before retrieving node releases');
    endpoint = process.env.GITHUB_ENDPOINT;
    delete process.env.GITHUB_ENDPOINT;
    token = process.env.GITHUB_TOKEN;
    process.env.GITHUB_TOKEN = process.env.GITHUB_COM_TOKEN;
  }
  try {
    if (options.ref === 'release') {
      const url = `repos/${repo}/releases?per_page=100`;
      versions = (await ghGot(url, { paginate: true })).body.map(
        o => o.tag_name
      );
    } else {
      // tag
      const url = `repos/${repo}/git/refs/tags?per_page=100`;
      const tagPrefix = 'refs/tags/';
      versions = (await ghGot(url, { paginate: true })).body
        .filter(o => o.ref && o.ref.startsWith(tagPrefix))
        .map(o => o.ref.replace(tagPrefix, ''));
    }
  } catch (err) {
    logger.info(
      { repo, err, message: err.message },
      'Error retrieving from github'
    );
  } finally {
    // istanbul ignore if
    if (endpoint) {
      logger.debug('Restoring GHE token and endpoint');
      process.env.GITHUB_TOKEN = token;
      process.env.GITHUB_ENDPOINT = endpoint;
    }
  }
  if (!versions) {
    return null;
  }
  versions = versions.filter(version => isVersion(version));
  if (options.clean === 'true') {
    versions = versions.map(version => version.replace(/^v/, ''));
  }
  const dependency = {
    repositoryUrl: 'https://github.com/' + repo,
    versions: {},
  };
  versions.forEach(version => {
    dependency.versions[version] = {};
  });
  return dependency;
}