conventional-changelog-action/node_modules/get-pkg-repo/index.js

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;