CodeIssuesDiscussionsWikiPull RequestsProjectsCommitsActionsReleasesContributorsPulse● GatesSecuritySettingsDeploymentsPipelineInsightsAgents✨ Explain✨ Ask AI✨ Workspace✨ Spec✨ Tests▓ Debt Map✨ NL Search🏛 Archaeology
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | import { fetchJSON, postJSON } from './client';
import { useSettingsStore } from '../store/settingsStore';
export interface Repository {
id: number;
name: string;
fullName: string;
description: string | null;
isPrivate: boolean;
isArchived: boolean;
isFork: boolean;
defaultBranch: string;
language: string | null;
starCount: number;
forkCount: number;
openIssueCount: number;
ownerUsername: string;
updatedAt: string;
createdAt: string;
}
export interface TreeEntry {
name: string;
type: 'blob' | 'tree';
mode: string;
sha: string;
path: string;
}
export interface FileContent {
name: string;
path: string;
sha: string;
content: string;
encoding: string;
size: number;
}
export interface CommitEntry {
sha: string;
message: string;
authorName: string;
authorEmail: string;
authorDate: string;
committerName: string;
committerDate: string;
parentShas: string[];
}
export interface BranchInfo {
name: string;
sha: string;
isDefault: boolean;
isProtected: boolean;
}
export interface SearchResult {
file: string;
line: number;
content: string;
sha: string;
}
export interface RepoStats {
commits: number;
branches: number;
tags: number;
contributors: number;
}
/** List repositories for a user. */
export async function listUserRepos(username: string): Promise<Repository[]> {
return fetchJSON<Repository[]>(`/api/users/${encodeURIComponent(username)}/repos`);
}
/** List all public repos (explore). */
export async function listPublicRepos(page = 1): Promise<Repository[]> {
return fetchJSON<Repository[]>(`/api/repos?page=${page}`);
}
/** Get a single repository. */
export async function getRepo(owner: string, repo: string): Promise<Repository> {
return fetchJSON<Repository>(`/api/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`);
}
/** List the file tree for a repo at a given ref and path. */
export async function getTree(
owner: string,
repo: string,
ref = 'HEAD',
path = '',
): Promise<TreeEntry[]> {
const encodedPath = path ? `/${encodeURIComponent(path)}` : '';
return fetchJSON<TreeEntry[]>(
`/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/tree/${encodeURIComponent(ref)}${encodedPath}?json=1`,
);
}
/** Get raw file content. */
export async function getFileContent(
owner: string,
repo: string,
ref: string,
path: string,
): Promise<string> {
const host = useSettingsStore.getState().host;
const response = await fetch(
`${host}/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/raw/${encodeURIComponent(ref)}/${path}`,
{
headers: { Accept: 'text/plain' },
},
);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.text();
}
/** List commits on a branch. */
export async function listCommits(
owner: string,
repo: string,
branch = 'HEAD',
page = 1,
): Promise<CommitEntry[]> {
return fetchJSON<CommitEntry[]>(
`/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/commits?branch=${encodeURIComponent(branch)}&page=${page}&json=1`,
);
}
/** List branches. */
export async function listBranches(owner: string, repo: string): Promise<BranchInfo[]> {
return fetchJSON<BranchInfo[]>(
`/api/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/branches`,
);
}
/** Star a repo. */
export async function starRepo(owner: string, repo: string): Promise<void> {
await postJSON(`/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/star`, {});
}
/** Search code in a repo. */
export async function searchCode(
owner: string,
repo: string,
query: string,
): Promise<SearchResult[]> {
return fetchJSON<SearchResult[]>(
`/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/search?q=${encodeURIComponent(query)}&json=1`,
);
}
|