GitHub.js

/**
 * @file
 * @copyright  2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.
 * @license    Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.
 *             Github.js is freely distributable.
 */
/* eslint valid-jsdoc: ["error", {"requireReturnDescription": false}] */

import Gist from './Gist';
import User from './User';
import Issue from './Issue';
import Search from './Search';
import RateLimit from './RateLimit';
import Repository from './Repository';
import Organization from './Organization';
import Team from './Team';
import Markdown from './Markdown';
import Project from './Project';

/**
 * GitHub encapsulates the functionality to create various API wrapper objects.
 */
class GitHub {
   /**
    * Create a new GitHub.
    * @param {Requestable.auth} [auth] - the credentials to authenticate to Github. If auth is
    *                                  not provided requests will be made unauthenticated
    * @param {string} [apiBase=https://api.github.com] - the base Github API URL
    */
   constructor(auth, apiBase = 'https://api.github.com') {
      this.__apiBase = apiBase;
      this.__auth = auth || {};
   }

   /**
    * Create a new Gist wrapper
    * @param {number} [id] - the id for the gist, leave undefined when creating a new gist
    * @return {Gist}
    */
   getGist(id) {
      return new Gist(id, this.__auth, this.__apiBase);
   }

   /**
    * Create a new User wrapper
    * @param {string} [user] - the name of the user to get information about
    *                        leave undefined for the authenticated user
    * @return {User}
    */
   getUser(user) {
      return new User(user, this.__auth, this.__apiBase);
   }

   /**
    * Create a new Organization wrapper
    * @param {string} organization - the name of the organization
    * @return {Organization}
    */
   getOrganization(organization) {
      return new Organization(organization, this.__auth, this.__apiBase);
   }

   /**
    * create a new Team wrapper
    * @param {string} teamId - the name of the team
    * @return {team}
    */
   getTeam(teamId) {
      return new Team(teamId, this.__auth, this.__apiBase);
   }

   /**
    * Create a new Repository wrapper
    * @param {string} user - the user who owns the respository
    * @param {string} repo - the name of the repository
    * @return {Repository}
    */
   getRepo(user, repo) {
      return new Repository(this._getFullName(user, repo), this.__auth, this.__apiBase);
   }

   /**
    * Create a new Issue wrapper
    * @param {string} user - the user who owns the respository
    * @param {string} repo - the name of the repository
    * @return {Issue}
    */
   getIssues(user, repo) {
      return new Issue(this._getFullName(user, repo), this.__auth, this.__apiBase);
   }

   /**
    * Create a new Search wrapper
    * @param {string} query - the query to search for
    * @return {Search}
    */
   search(query) {
      return new Search(query, this.__auth, this.__apiBase);
   }

   /**
    * Create a new RateLimit wrapper
    * @return {RateLimit}
    */
   getRateLimit() {
      return new RateLimit(this.__auth, this.__apiBase);
   }

   /**
    * Create a new Markdown wrapper
    * @return {Markdown}
    */
   getMarkdown() {
      return new Markdown(this.__auth, this.__apiBase);
   }

   /**
    * Create a new Project wrapper
    * @param {string} id - the id of the project
    * @return {Markdown}
    */
   getProject(id) {
      return new Project(id, this.__auth, this.__apiBase);
   }

   /**
    * Computes the full repository name
    * @param {string} user - the username (or the full name)
    * @param {string} repo - the repository name, must not be passed if `user` is the full name
    * @return {string} the repository's full name
    */
   _getFullName(user, repo) {
      let fullname = user;

      if (repo) {
         fullname = `${user}/${repo}`;
      }

      return fullname;
   }
}

module.exports = GitHub;