86 lines
2.0 KiB
JavaScript
86 lines
2.0 KiB
JavaScript
'use strict';
|
|
var parseSlug = require('parse-github-repo-url');
|
|
var normalizeData = require('normalize-package-data');
|
|
var hostedGitInfo = require('hosted-git-info');
|
|
var url = require('url');
|
|
var typos = require('./typos');
|
|
|
|
var gitAt = /^git@/;
|
|
|
|
function gitAtToHttpsUrl(repoUrl) {
|
|
repoUrl = repoUrl.replace(':', '/');
|
|
repoUrl = repoUrl.replace(gitAt, 'https://');
|
|
return repoUrl;
|
|
}
|
|
|
|
function parseRepoUrl(repoUrl) {
|
|
var parsed = url.parse(repoUrl);
|
|
if (!parsed.host) {
|
|
var gitAt = /^git@/;
|
|
if (gitAt.test(repoUrl)) {
|
|
parsed = url.parse(gitAtToHttpsUrl(repoUrl));
|
|
}
|
|
}
|
|
return parsed;
|
|
}
|
|
|
|
function getType(repoUrl) {
|
|
if (repoUrl.indexOf('github') !== -1) {
|
|
return 'github';
|
|
}
|
|
if (repoUrl.indexOf('gitlab') !== -1) {
|
|
return 'gitlab';
|
|
}
|
|
}
|
|
|
|
function unknownHostedInfo(repoUrl) {
|
|
var parsed = parseRepoUrl(repoUrl);
|
|
var protocol = parsed.protocol === 'https:' ? 'https:' : 'http:';
|
|
var browseUrl = protocol + '//' + (parsed.host || '') + parsed.path.replace(/\.git$/, '').replace(/\/$/, '');
|
|
|
|
var UnknownGitHost = function() {
|
|
var slug = parseSlug(repoUrl);
|
|
|
|
if (parsed.host) {
|
|
this.domain = parsed.host;
|
|
}
|
|
|
|
this.user = slug[0];
|
|
this.project = slug[1];
|
|
|
|
this.type = getType(repoUrl);
|
|
};
|
|
|
|
UnknownGitHost.prototype.browse = function() {
|
|
return browseUrl;
|
|
};
|
|
|
|
return new UnknownGitHost();
|
|
}
|
|
|
|
function getPkgRepo(pkgData, fixTypo) {
|
|
try {
|
|
pkgData = JSON.parse(pkgData);
|
|
} catch (err) {}
|
|
|
|
if (fixTypo && !pkgData.repository) {
|
|
typos.forEach(function(val) {
|
|
if (pkgData[val]) {
|
|
pkgData.repository = pkgData[val];
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
normalizeData(pkgData);
|
|
|
|
var repo = pkgData.repository;
|
|
if (!repo || !repo.url) {
|
|
throw new Error('No "repository" field found in your package.json file.' +
|
|
' Please see https://docs.npmjs.com/files/package.json#repository for proper syntax.');
|
|
}
|
|
|
|
return hostedGitInfo.fromUrl(repo.url) || unknownHostedInfo(repo.url);
|
|
}
|
|
|
|
module.exports = getPkgRepo;
|