diff options
| author | Joe Mou <dev@mou.fo> | 2026-01-28 22:41:00 -0500 |
|---|---|---|
| committer | Joe Mou <dev@mou.fo> | 2026-01-28 23:03:09 -0500 |
| commit | 7416f8b40fd07031c56584bd089f910185d58f89 (patch) | |
| tree | 7c9fd93dbe03ca69bcfebd9e82c31f9491a5a967 /src/scraper.ts | |
| parent | 8770424ae7a0affbb4b05903d355fe856f853797 (diff) | |
Commits list
Diffstat (limited to 'src/scraper.ts')
| -rw-r--r-- | src/scraper.ts | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/scraper.ts b/src/scraper.ts index e58402a..71d0e3e 100644 --- a/src/scraper.ts +++ b/src/scraper.ts @@ -54,6 +54,26 @@ interface IssueIndexPageQuery { type StylingDirective = [number, number, string]; +interface Commit { + oid: string; + url: string; + authoredDate: string; + committedDate: string; + shortMessage: string; + bodyMessageHtml: string; + authors: { + login: string; + displayName: string; + avatarUrl: string; + path: string; + }[]; +} + +export interface CommitGroup { + title: string; + commits: Commit[]; +} + interface RawPayload { repo: { ownerLogin: string; @@ -82,6 +102,7 @@ interface RawPayload { overview?: { overviewFiles?: OverviewFile[]; }; + commitGroups?: CommitGroup[]; // Actually there may be other query types. preloadedQueries?: IssueIndexPageQuery[]; } @@ -159,6 +180,10 @@ export interface GitHubIssues extends GitHubCommon { issues: Issue[]; } +export interface GitHubCommits extends GitHubNav { + commitGroups: CommitGroup[]; +} + async function fetchGitHubPage(path: string): Promise<string> { // GitHub throttles/blocks requests without realistic browser headers. // These headers make the request appear as a standard browser visit. @@ -350,3 +375,31 @@ export async function getGitHubIssues(owner: string, repo: string): Promise<GitH issues, }; } + +export async function getGitHubCommits( + owner: string, + repo: string, + branch: string, + path: string, +): Promise<GitHubCommits> { + const urlPath = path + ? `${owner}/${repo}/commits/${branch}/${path}` + : `${owner}/${repo}/commits/${branch}`; + const html = await fetchGitHubPage(urlPath); + + const payload = parsePayload(html, "react-app.embeddedData", ["payload"]); + + if (payload?.commitGroups === undefined) { + throw new Error("Could not find commit history in embedded JSON"); + } + + return { + repo: { + owner, + name: repo, + }, + branch, + path, + commitGroups: payload.commitGroups, + }; +} |
