60 lines
1.8 KiB
JavaScript
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;
|
|
};
|
|
}
|