Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | 6x 6x 79x 6x 79x 50x 50x 4x 4x 2x 29x 29x 3x 3x 2x 86x 86x 86x 86x 84x 4x 6x 71x 71x | import { enhancedFetch } from "./fetch"; /** * Simple heuristic to determine if a path likely represents a project * Projects typically contain a slash (group/project), while groups usually don't */ export function isLikelyProjectPath(namespacePath: string): boolean { return namespacePath.includes("/"); } /** * Detect namespace type by attempting to fetch from GitLab API * Tries both project and group endpoints to determine which one exists */ export async function detectNamespaceType(namespacePath: string): Promise<"project" | "group"> { // First try heuristic for common cases if (isLikelyProjectPath(namespacePath)) { // Try project first, fallback to group if needed const isProject = await verifyNamespaceType(namespacePath, "project"); if (isProject) return "project"; const isGroup = await verifyNamespaceType(namespacePath, "group"); if (isGroup) return "group"; // Default fallback for paths with slash return "project"; } else { // Try group first, fallback to project if needed const isGroup = await verifyNamespaceType(namespacePath, "group"); if (isGroup) return "group"; const isProject = await verifyNamespaceType(namespacePath, "project"); if (isProject) return "project"; // Default fallback for paths without slash return "group"; } } /** * Verify if a namespace exists as the specified type by making a lightweight API call */ async function verifyNamespaceType( namespacePath: string, type: "project" | "group" ): Promise<boolean> { try { const entityType = type === "project" ? "projects" : "groups"; const apiUrl = `${process.env.GITLAB_API_URL}/api/v4/${entityType}/${encodeURIComponent(namespacePath)}`; const response = await enhancedFetch(apiUrl, { headers: { Authorization: `Bearer ${process.env.GITLAB_TOKEN}`, }, }); return response.ok; } catch { // If API call fails, return false return false; } } /** * Determine the appropriate entity type and path for GitLab API calls * Returns the entity type ('projects' or 'groups') and ensures proper encoding */ export async function resolveNamespaceForAPI(namespacePath: string): Promise<{ entityType: "projects" | "groups"; encodedPath: string; }> { const namespaceType = await detectNamespaceType(namespacePath); return { entityType: namespaceType === "project" ? "projects" : "groups", encodedPath: encodeURIComponent(namespacePath), }; } |