conventional-changelog-action/node_modules/@hutson/parse-repository-url/src/index.js

60 lines
1.8 KiB
JavaScript

'use strict';
const { parse } = require(`url`);
const URL_PATTERNS = new RegExp(/^\/?:?([/\w-.]+)\/([\w-.]+)\/?$/);
const GITHUB_API = new RegExp(/^\/repos\/([\w-.]+)\/([\w-.]+)\/(?:tarball|zipball)(?:\/.+)?$/);
const GITHUB_CODELOAD = new RegExp(/^\/([\w-.]+)\/([\w-.]+)\/(?:legacy\.(?:zip|tar\.gz))(?:\/.+)?$/);
module.exports = url => {
const modifiedURL = url
// Prepend `https` to the URL so that `url.parse` will see the value of `url` as an actual `url`, and therefore, correctly parse it.
.replace(/^git@/, `https://git@`)
// Remove `.git` from any URL before applying regular expressions to the string. Removing `.git` through a non capture group is kind of difficult.
.replace(/\.git$/, ``);
const parsedURL = parse(modifiedURL);
const format = matches => {
return { browse: createBrowseURL(parsedURL, matches), domain: parsedURL.host, project: matches[2] || null, type: getType(parsedURL), user: matches[1] || null };
};
if (parsedURL.host) {
if (parsedURL.host.includes(`api.github.com`)) {
const matches = GITHUB_API.exec(parsedURL.pathname) || [];
return format(matches);
}
if (parsedURL.host.includes(`codeload.github.com`)) {
const matches = GITHUB_CODELOAD.exec(parsedURL.pathname) || [];
return format(matches);
}
}
return format(URL_PATTERNS.exec(parsedURL.pathname) || []);
};
function getType (parsedURL) {
if (typeof parsedURL.host !== `string`) {
return null;
}
if (parsedURL.host.indexOf(`github`) !== -1) {
return 'github';
}
if (parsedURL.host.indexOf(`gitlab`) !== -1) {
return 'gitlab';
}
return null;
}
function createBrowseURL (parsedURL, matches) {
const protocol = parsedURL.protocol === `http:` ? `http:` : `https:`;
const browseURL = `${protocol}//${parsedURL.host}/${matches[1]}/${matches[2]}`;
return () => {
return browseURL;
};
}