git-host.js
  1  'use strict'
  2  var gitHosts = require('./git-host-info.js')
  3  /* eslint-disable node/no-deprecated-api */
  4  
  5  // copy-pasta util._extend from node's source, to avoid pulling
  6  // the whole util module into peoples' webpack bundles.
  7  /* istanbul ignore next */
  8  var extend = Object.assign || function _extend (target, source) {
  9    // Don't do anything if source isn't an object
 10    if (source === null || typeof source !== 'object') return target
 11  
 12    var keys = Object.keys(source)
 13    var i = keys.length
 14    while (i--) {
 15      target[keys[i]] = source[keys[i]]
 16    }
 17    return target
 18  }
 19  
 20  module.exports = GitHost
 21  function GitHost (type, user, auth, project, committish, defaultRepresentation, opts) {
 22    var gitHostInfo = this
 23    gitHostInfo.type = type
 24    Object.keys(gitHosts[type]).forEach(function (key) {
 25      gitHostInfo[key] = gitHosts[type][key]
 26    })
 27    gitHostInfo.user = user
 28    gitHostInfo.auth = auth
 29    gitHostInfo.project = project
 30    gitHostInfo.committish = committish
 31    gitHostInfo.default = defaultRepresentation
 32    gitHostInfo.opts = opts || {}
 33  }
 34  
 35  GitHost.prototype.hash = function () {
 36    return this.committish ? '#' + this.committish : ''
 37  }
 38  
 39  GitHost.prototype._fill = function (template, opts) {
 40    if (!template) return
 41    var vars = extend({}, opts)
 42    vars.path = vars.path ? vars.path.replace(/^[/]+/g, '') : ''
 43    opts = extend(extend({}, this.opts), opts)
 44    var self = this
 45    Object.keys(this).forEach(function (key) {
 46      if (self[key] != null && vars[key] == null) vars[key] = self[key]
 47    })
 48    var rawAuth = vars.auth
 49    var rawcommittish = vars.committish
 50    var rawFragment = vars.fragment
 51    var rawPath = vars.path
 52    var rawProject = vars.project
 53    Object.keys(vars).forEach(function (key) {
 54      var value = vars[key]
 55      if ((key === 'path' || key === 'project') && typeof value === 'string') {
 56        vars[key] = value.split('/').map(function (pathComponent) {
 57          return encodeURIComponent(pathComponent)
 58        }).join('/')
 59      } else {
 60        vars[key] = encodeURIComponent(value)
 61      }
 62    })
 63    vars['auth@'] = rawAuth ? rawAuth + '@' : ''
 64    vars['#fragment'] = rawFragment ? '#' + this.hashformat(rawFragment) : ''
 65    vars.fragment = vars.fragment ? vars.fragment : ''
 66    vars['#path'] = rawPath ? '#' + this.hashformat(rawPath) : ''
 67    vars['/path'] = vars.path ? '/' + vars.path : ''
 68    vars.projectPath = rawProject.split('/').map(encodeURIComponent).join('/')
 69    if (opts.noCommittish) {
 70      vars['#committish'] = ''
 71      vars['/tree/committish'] = ''
 72      vars['/committish'] = ''
 73      vars.committish = ''
 74    } else {
 75      vars['#committish'] = rawcommittish ? '#' + rawcommittish : ''
 76      vars['/tree/committish'] = vars.committish
 77        ? '/' + vars.treepath + '/' + vars.committish
 78        : ''
 79      vars['/committish'] = vars.committish ? '/' + vars.committish : ''
 80      vars.committish = vars.committish || 'master'
 81    }
 82    var res = template
 83    Object.keys(vars).forEach(function (key) {
 84      res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key])
 85    })
 86    if (opts.noGitPlus) {
 87      return res.replace(/^git[+]/, '')
 88    } else {
 89      return res
 90    }
 91  }
 92  
 93  GitHost.prototype.ssh = function (opts) {
 94    return this._fill(this.sshtemplate, opts)
 95  }
 96  
 97  GitHost.prototype.sshurl = function (opts) {
 98    return this._fill(this.sshurltemplate, opts)
 99  }
100  
101  GitHost.prototype.browse = function (P, F, opts) {
102    if (typeof P === 'string') {
103      if (typeof F !== 'string') {
104        opts = F
105        F = null
106      }
107      return this._fill(this.browsefiletemplate, extend({
108        fragment: F,
109        path: P
110      }, opts))
111    } else {
112      return this._fill(this.browsetemplate, P)
113    }
114  }
115  
116  GitHost.prototype.docs = function (opts) {
117    return this._fill(this.docstemplate, opts)
118  }
119  
120  GitHost.prototype.bugs = function (opts) {
121    return this._fill(this.bugstemplate, opts)
122  }
123  
124  GitHost.prototype.https = function (opts) {
125    return this._fill(this.httpstemplate, opts)
126  }
127  
128  GitHost.prototype.git = function (opts) {
129    return this._fill(this.gittemplate, opts)
130  }
131  
132  GitHost.prototype.shortcut = function (opts) {
133    return this._fill(this.shortcuttemplate, opts)
134  }
135  
136  GitHost.prototype.path = function (opts) {
137    return this._fill(this.pathtemplate, opts)
138  }
139  
140  GitHost.prototype.tarball = function (opts_) {
141    var opts = extend({}, opts_, { noCommittish: false })
142    return this._fill(this.tarballtemplate, opts)
143  }
144  
145  GitHost.prototype.file = function (P, opts) {
146    return this._fill(this.filetemplate, extend({ path: P }, opts))
147  }
148  
149  GitHost.prototype.getDefaultRepresentation = function () {
150    return this.default
151  }
152  
153  GitHost.prototype.toString = function (opts) {
154    if (this.default && typeof this[this.default] === 'function') return this[this.default](opts)
155    return this.sshurl(opts)
156  }