Files
continue/core/util/repoUrl.ts
Tomasz Stefaniak 0e9dc1375f fix: repo edge case
2025-10-17 11:43:50 -07:00

71 lines
2.2 KiB
TypeScript

/**
* Utility functions for normalizing and handling repository URLs.
*/
/**
* Normalizes a repository URL to a consistent format.
*
* Handles various Git URL formats and converts them to a standard HTTPS GitHub URL:
* - SSH format: `git@github.com:owner/repo.git` → `https://github.com/owner/repo`
* - SSH protocol: `ssh://git@github.com/owner/repo.git` → `https://github.com/owner/repo`
* - Shorthand: `owner/repo` → `https://github.com/owner/repo`
* - Removes `.git` suffix
* - Removes trailing slashes
* - Normalizes to lowercase
*
* @param url - The repository URL to normalize
* @returns The normalized repository URL in lowercase HTTPS format
*
* @example
* ```typescript
* normalizeRepoUrl("git@github.com:owner/repo.git")
* // Returns: "https://github.com/owner/repo"
*
* normalizeRepoUrl("owner/repo")
* // Returns: "https://github.com/owner/repo"
*
* normalizeRepoUrl("https://github.com/Owner/Repo.git")
* // Returns: "https://github.com/owner/repo"
* ```
*/
export function normalizeRepoUrl(url: string): string {
if (!url) return "";
let normalized = url.trim();
// Convert SSH to HTTPS: git@github.com:owner/repo.git -> https://github.com/owner/repo
if (normalized.startsWith("git@github.com:")) {
normalized = normalized.replace("git@github.com:", "https://github.com/");
}
// Convert SSH protocol to HTTPS: ssh://git@github.com/owner/repo.git -> https://github.com/owner/repo
// Also handles: ssh://git@github.com:owner/repo.git (less common)
if (normalized.startsWith("ssh://git@github.com")) {
normalized = normalized
.replace("ssh://git@github.com/", "https://github.com/")
.replace("ssh://git@github.com:", "https://github.com/");
}
// Convert shorthand owner/repo to full URL
if (
normalized.includes("/") &&
!/^[a-z]+:\/\//i.test(normalized) &&
!normalized.startsWith("git@")
) {
normalized = `https://github.com/${normalized}`;
}
// Remove trailing slash before removing .git suffix
if (normalized.endsWith("/")) {
normalized = normalized.slice(0, -1);
}
// Remove .git suffix
if (normalized.endsWith(".git")) {
normalized = normalized.slice(0, -4);
}
// Normalize to lowercase
return normalized.toLowerCase();
}