Skip to content
Snippets Groups Projects
Select Git revision
  • f717345ec9cd3634d571eb48df7232bc0a43f8e6
  • master default protected
  • greenkeeper/webpack-4.10.1
  • greenkeeper/webpack-4.10.0
  • greenkeeper/webpack-4.9.2
  • greenkeeper/promise-polyfill-8.0.0
  • greenkeeper/webpack-4.9.1
  • greenkeeper/webpack-4.9.0
  • greenkeeper/webpack-manifest-plugin-2.0.3
  • greenkeeper/update-to-node-10
  • gh-pages
  • greenkeeper/webpack-4.8.3
  • greenkeeper/webpack-4.8.2
  • greenkeeper/webpack-4.7.0
  • greenkeeper/webpack-manifest-plugin-2.0.2
  • greenkeeper/webpack-manifest-plugin-2.0.1
  • greenkeeper/style-loader-0.21.0
  • greenkeeper/webpack-4.6.0
  • greenkeeper/sass-loader-7.0.1
  • greenkeeper/sass-loader-7.0.0
  • greenkeeper/webpack-manifest-plugin-2.0.0
  • 2.7.3
  • 2.7.2
  • 2.7.1
  • 2.7.0
  • 2.6.6
  • 2.6.5
  • 2.6.4
  • 2.6.3
  • 2.6.2
  • 2.6.1
  • 2.6.0
  • 2.5.5
  • 2.5.4
  • 2.5.3
  • 2.5.2
  • 2.5.1
  • 2.5.0
  • 2.4.0
  • 2.3.0
  • 2.2.6
41 results

GitHub.js

Blame
  • GitHub.js 2.90 KiB
    /*
     * Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy
     * of this software and associated documentation files (the "Software"), to
     * deal in the Software without restriction, including without limitation the
     * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
     * sell copies of the Software, and to permit persons to whom the Software is
     * furnished to do so, subject to the following conditions:
     *
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     * IN THE SOFTWARE.
     */
    
    import Abstract from "./Abstract"
    
    /* ----------------------------------------------------------------------------
     * Class
     * ------------------------------------------------------------------------- */
    
    export default class GitHub extends Abstract {
    
      /**
       * Retrieve repository information from GitHub
       *
       * @constructor
       *
       * @property {string} name_ - Name of the repository
       *
       * @param {(string|HTMLAnchorElement)} el - Selector or HTML element
       */
      constructor(el) {
        super(el)
    
        /* Extract user (and repository name) from URL, as we have to query for all
           repositories, to omit 404 errors for private repositories */
        const matches = /^.+github\.com\/([^/]+)\/?([^/]+)?.*$/
          .exec(this.base_)
        if (matches && matches.length === 3) {
          const [, user, name] = matches
    
          /* Initialize base URL and repository name */
          this.base_ = `https://api.github.com/users/${user}/repos`
          this.name_ = name
        }
      }
    
      /**
       * Fetch relevant repository information from GitHub
       *
       * @return {Promise<Array<string>>} Promise returning an array of facts
       */
      fetch_() {
        return fetch(this.base_)
          .then(response => response.json())
          .then(data => {
            if (!(data instanceof Array))
              throw new TypeError
    
            /* Display number of stars and forks, if repository is given */
            if (this.name_) {
              const repo = data.find(item => item.name === this.name_)
              return repo
                ? [
                  `${this.format_(repo.stargazers_count)} Stars`,
                  `${this.format_(repo.forks_count)} Forks`
                ]
                : []
    
            /* Display number of repositories, otherwise */
            } else {
              return [
                `${data.length} Repositories`
              ]
            }
          })
      }
    }