'use strict' const gitHosts = require('./git-host-info.js') class GitHost { constructor (type, user, auth, project, committish, defaultRepresentation, opts = {}) { Object.assign(this, gitHosts[type]) this.type = type this.user = user this.auth = auth this.project = project this.committish = committish this.default = defaultRepresentation this.opts = opts } hash () { return this.committish ? `#${this.committish}` : '' } ssh (opts) { return this._fill(this.sshtemplate, opts) } _fill (template, opts) { if (typeof template === 'function') { const options = { ...this, ...this.opts, ...opts } // the path should always be set so we don't end up with 'undefined' in urls if (!options.path) { options.path = '' } // template functions will insert the leading slash themselves if (options.path.startsWith('/')) { options.path = options.path.slice(1) } if (options.noCommittish) { options.committish = null } const result = template(options) return options.noGitPlus && result.startsWith('git+') ? result.slice(4) : result } return null } sshurl (opts) { return this._fill(this.sshurltemplate, opts) } browse (path, fragment, opts) { // not a string, treat path as opts if (typeof path !== 'string') { return this._fill(this.browsetemplate, path) } if (typeof fragment !== 'string') { opts = fragment fragment = null } return this._fill(this.browsefiletemplate, { ...opts, fragment, path }) } docs (opts) { return this._fill(this.docstemplate, opts) } bugs (opts) { return this._fill(this.bugstemplate, opts) } https (opts) { return this._fill(this.httpstemplate, opts) } git (opts) { return this._fill(this.gittemplate, opts) } shortcut (opts) { return this._fill(this.shortcuttemplate, opts) } path (opts) { return this._fill(this.pathtemplate, opts) } tarball (opts) { return this._fill(this.tarballtemplate, { ...opts, noCommittish: false }) } file (path, opts) { return this._fill(this.filetemplate, { ...opts, path }) } getDefaultRepresentation () { return this.default } toString (opts) { if (this.default && typeof this[this.default] === 'function') { return this[this.default](opts) } return this.sshurl(opts) } } module.exports = GitHost