tunnckoCore/github-generate-token

View on GitHub
index.js

Summary

Maintainability
A
2 hrs
Test Coverage
/*!
 * github-generate-token <https://github.com/tunnckoCore/github-generate-token>
 *
 * Copyright (c) 2015 Charlike Mike Reagent, contributors.
 * Released under the MIT license.
 */

/* jshint asi:true */

'use strict'

var typeOf = require('kind-of')
var concat = require('concat-stream')
var request = require('simple-get')

/**
 * > Generate github token with Basic Auth
 *
 * **Example**
 *
 * ```js
 * var generateToken = require('github-generate-token')
 *
 * var opts = {
 *   scopes: ['user', 'gist'],
 *   note: 'my awesome app note'
 * }
 *
 * generateToken('username:password', opts, function (err, data) {
 *   if (err) return console.error(err)
 *
 *   console.log(data.token) //=> token
 * })
 * ```
 *
 * @name   githubGenerateToken
 * @param  {String}   `<credentials>` credentials pattern `username:password`
 * @param  {Object}   `[opts]` options like `scopes` and `note`
 * @param  {Function} `<callback>` node style callback
 * @api public
 */

module.exports = function githubGenerateToken (credentials, opts, callback) {
  if (typeOf(credentials) !== 'string') {
    throw new TypeError('[github-generate-token] expect `credentials` be string')
  }
  if (credentials.indexOf(':') === -1) {
    throw new Error('[github-generate-token] invalid `credentials` given')
  }
  if (!callback && typeOf(opts) === 'function') {
    callback = opts
    opts = {}
  }
  opts = typeOf(opts) === 'object' ? opts : {}

  opts.scopes = typeOf(opts.scopes) === 'array'
  opts.note = typeOf(opts.note) === 'string'
  callback = typeOf(callback) === 'function' ? callback : function noop () {}

  var body = {}
  body.scopes = opts.scopes ? opts.scopes : ['user', 'repo', 'gist']
  body.note = opts.note ? opts.note : 'tunnckoCore/github-generate-token'

  request({
    url: 'https://api.github.com/authorizations',
    body: JSON.stringify(body),
    method: 'post',
    headers: {
      'user-agent': 'https://github.com/tunnckoCore/github-generate-token',
      'authorization': 'Basic ' + new Buffer(credentials).toString('base64')
    }
  }, function (err, res) {
    if (err) return callback(err)

    res.pipe(concat(function (data) {
      callback(null, JSON.parse(data.toString()), res, data)
    }))
  })
}