'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; }; }