56 lines
1.7 KiB
JavaScript
56 lines
1.7 KiB
JavaScript
import { getRemoteUrl } from '../../git/index.js';
|
|
|
|
export const parseGitHubRemoteUrl = (raw) => {
|
|
if (typeof raw !== 'string') {
|
|
return null;
|
|
}
|
|
const value = raw.trim();
|
|
if (!value) {
|
|
return null;
|
|
}
|
|
|
|
// git@github.com:OWNER/REPO.git
|
|
if (value.startsWith('git@github.com:')) {
|
|
const rest = value.slice('git@github.com:'.length);
|
|
const cleaned = rest.endsWith('.git') ? rest.slice(0, -4) : rest;
|
|
const [owner, repo] = cleaned.split('/');
|
|
if (!owner || !repo) return null;
|
|
return { owner, repo, url: `https://github.com/${owner}/${repo}` };
|
|
}
|
|
|
|
// ssh://git@github.com/OWNER/REPO.git
|
|
if (value.startsWith('ssh://git@github.com/')) {
|
|
const rest = value.slice('ssh://git@github.com/'.length);
|
|
const cleaned = rest.endsWith('.git') ? rest.slice(0, -4) : rest;
|
|
const [owner, repo] = cleaned.split('/');
|
|
if (!owner || !repo) return null;
|
|
return { owner, repo, url: `https://github.com/${owner}/${repo}` };
|
|
}
|
|
|
|
// https://github.com/OWNER/REPO(.git)
|
|
try {
|
|
const url = new URL(value);
|
|
if (url.hostname !== 'github.com') {
|
|
return null;
|
|
}
|
|
const path = url.pathname.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
const cleaned = path.endsWith('.git') ? path.slice(0, -4) : path;
|
|
const [owner, repo] = cleaned.split('/');
|
|
if (!owner || !repo) return null;
|
|
return { owner, repo, url: `https://github.com/${owner}/${repo}` };
|
|
} catch {
|
|
return null;
|
|
}
|
|
};
|
|
|
|
export async function resolveGitHubRepoFromDirectory(directory, remoteName = 'origin') {
|
|
const remoteUrl = await getRemoteUrl(directory, remoteName).catch(() => null);
|
|
if (!remoteUrl) {
|
|
return { repo: null, remoteUrl: null };
|
|
}
|
|
return {
|
|
repo: parseGitHubRemoteUrl(remoteUrl),
|
|
remoteUrl,
|
|
};
|
|
}
|