@rawdash/connector-github 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +53 -28
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -36,6 +36,7 @@ declare class GitHubActionsConnector extends BaseConnector<GitHubActionsSettings
|
|
|
36
36
|
private syncDeployments;
|
|
37
37
|
private syncReleases;
|
|
38
38
|
private syncContributors;
|
|
39
|
+
private syncRepoStats;
|
|
39
40
|
sync(request: SyncRequest, storage: StorageHandle, signal?: AbortSignal): Promise<void>;
|
|
40
41
|
}
|
|
41
42
|
|
package/dist/index.js
CHANGED
|
@@ -135,7 +135,7 @@ var GitHubActionsConnector = class _GitHubActionsConnector extends BaseConnector
|
|
|
135
135
|
while (true) {
|
|
136
136
|
signal?.throwIfAborted();
|
|
137
137
|
const res = await fetch(
|
|
138
|
-
`https://api.github.com/repos/${owner}/${repo}/pulls?state=
|
|
138
|
+
`https://api.github.com/repos/${owner}/${repo}/pulls?state=all&per_page=100&page=${page}`,
|
|
139
139
|
{ headers, signal }
|
|
140
140
|
);
|
|
141
141
|
if (!res.ok) {
|
|
@@ -353,34 +353,31 @@ var GitHubActionsConnector = class _GitHubActionsConnector extends BaseConnector
|
|
|
353
353
|
async syncContributors(storage, signal) {
|
|
354
354
|
const { owner, repo } = this.settings;
|
|
355
355
|
const headers = this.buildHeaders();
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
356
|
+
const contributors = await this.withRetry(
|
|
357
|
+
async (sig) => {
|
|
358
|
+
const res = await fetch(
|
|
359
|
+
`https://api.github.com/repos/${owner}/${repo}/stats/contributors`,
|
|
360
|
+
{ headers, signal: sig }
|
|
361
|
+
);
|
|
362
|
+
if (res.status === 202) {
|
|
363
|
+
return { status: "retry" };
|
|
364
|
+
}
|
|
365
|
+
if (!res.ok) {
|
|
366
|
+
throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
status: "done",
|
|
370
|
+
value: await res.json()
|
|
371
|
+
};
|
|
372
|
+
},
|
|
373
|
+
{ maxAttempts: 15, initialDelayMs: 1e3, maxDelayMs: 1e4, signal }
|
|
374
|
+
);
|
|
375
|
+
if (!contributors || contributors.length === 0) {
|
|
376
|
+
if (!contributors) {
|
|
377
|
+
console.warn(
|
|
378
|
+
"[github-actions] Stats endpoint never became ready \u2014 skipping contributor sync and keeping previous data."
|
|
379
|
+
);
|
|
379
380
|
}
|
|
380
|
-
contributors = await res.json();
|
|
381
|
-
break;
|
|
382
|
-
}
|
|
383
|
-
if (!contributors) {
|
|
384
381
|
return;
|
|
385
382
|
}
|
|
386
383
|
await storage.entities(
|
|
@@ -403,7 +400,35 @@ var GitHubActionsConnector = class _GitHubActionsConnector extends BaseConnector
|
|
|
403
400
|
{ types: ["contributor"] }
|
|
404
401
|
);
|
|
405
402
|
}
|
|
403
|
+
async syncRepoStats(storage, signal) {
|
|
404
|
+
const { owner, repo } = this.settings;
|
|
405
|
+
const headers = this.buildHeaders();
|
|
406
|
+
const res = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {
|
|
407
|
+
headers,
|
|
408
|
+
signal
|
|
409
|
+
});
|
|
410
|
+
if (!res.ok) {
|
|
411
|
+
throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);
|
|
412
|
+
}
|
|
413
|
+
const data = await res.json();
|
|
414
|
+
await storage.entities(
|
|
415
|
+
[
|
|
416
|
+
{
|
|
417
|
+
type: "repo",
|
|
418
|
+
id: `${owner}/${repo}`,
|
|
419
|
+
attributes: {
|
|
420
|
+
stars: data.stargazers_count,
|
|
421
|
+
forks: data.forks_count,
|
|
422
|
+
watchers: data.subscribers_count
|
|
423
|
+
},
|
|
424
|
+
updated_at: Date.now()
|
|
425
|
+
}
|
|
426
|
+
],
|
|
427
|
+
{ types: ["repo"] }
|
|
428
|
+
);
|
|
429
|
+
}
|
|
406
430
|
async sync(request, storage, signal) {
|
|
431
|
+
await this.syncRepoStats(storage, signal);
|
|
407
432
|
await this.syncWorkflowRuns(storage, request, signal);
|
|
408
433
|
await this.syncPullRequests(storage, signal);
|
|
409
434
|
await this.syncIssues(storage, request, signal);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/github-actions.ts"],"sourcesContent":["import {\n BaseConnector,\n type CredentialSchema,\n type StorageHandle,\n type SyncRequest,\n defineConfigFields,\n} from '@rawdash/core';\nimport { z } from 'zod';\n\nexport const configFields = defineConfigFields(\n z.object({\n owner: z.string().min(1).meta({\n label: 'Repository owner',\n description: 'GitHub username or organization name.',\n placeholder: 'rawdash',\n }),\n repo: z.string().min(1).meta({\n label: 'Repository',\n description: 'Repository name.',\n placeholder: 'rawdash',\n }),\n token: z.object({ $secret: z.string() }).optional().meta({\n label: 'Personal access token',\n description: 'GitHub PAT with `repo` scope.',\n secret: true,\n }),\n }),\n);\n\nexport interface GitHubActionsSettings {\n owner: string;\n repo: string;\n}\n\ninterface GitHubRunsResponse {\n workflow_runs: Array<{\n id: number;\n name: string;\n conclusion: string | null;\n status: string;\n head_branch: string | null;\n actor: { login: string } | null;\n created_at: string;\n updated_at: string;\n run_attempt: number;\n }>;\n}\n\ninterface GitHubPR {\n number: number;\n title: string;\n state: string;\n draft: boolean;\n user: { login: string };\n created_at: string;\n updated_at: string;\n}\n\ninterface GitHubReview {\n user: { login: string } | null;\n state: string;\n submitted_at: string;\n}\n\ninterface GitHubIssue {\n number: number;\n title: string;\n state: string;\n labels: Array<{ name: string }>;\n assignees: Array<{ login: string }>;\n user: { login: string };\n created_at: string;\n updated_at: string;\n closed_at: string | null;\n pull_request?: unknown;\n}\n\ninterface GitHubDeployment {\n id: number;\n environment: string;\n ref: string;\n sha: string;\n creator: { login: string } | null;\n created_at: string;\n}\n\ninterface GitHubDeploymentStatus {\n state: string;\n updated_at: string;\n}\n\ninterface GitHubRelease {\n id: number;\n tag_name: string;\n name: string | null;\n draft: boolean;\n prerelease: boolean;\n created_at: string;\n published_at: string | null;\n author: { login: string };\n}\n\ninterface GitHubContributorStats {\n total: number;\n weeks: Array<{ w: number; a: number; d: number; c: number }>;\n author: { login: string };\n}\n\nconst githubCredentials = {\n token: {\n description: 'GitHub personal access token',\n auth: 'optional' as const,\n },\n} satisfies CredentialSchema;\n\ntype GitHubCredentials = typeof githubCredentials;\n\nexport class GitHubActionsConnector extends BaseConnector<\n GitHubActionsSettings,\n GitHubCredentials\n> {\n static readonly id = 'github-actions';\n\n static create(input: unknown): GitHubActionsConnector {\n const parsed = configFields.parse(input);\n return new GitHubActionsConnector(\n { owner: parsed.owner, repo: parsed.repo },\n { token: parsed.token },\n );\n }\n\n readonly id = 'github-actions';\n\n override readonly credentials = githubCredentials;\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n };\n if (this.creds.token) {\n headers['Authorization'] = `Bearer ${this.creds.token}`;\n }\n return headers;\n }\n\n private async syncWorkflowRuns(\n storage: StorageHandle,\n request: SyncRequest,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n\n if (request.mode === 'latest') {\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/actions/runs?per_page=1`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const data = (await res.json()) as GitHubRunsResponse;\n const run = data.workflow_runs[0];\n if (run) {\n await storage.event({\n name: 'workflow_run',\n start_ts: new Date(run.created_at).getTime(),\n end_ts: new Date(run.updated_at).getTime(),\n attributes: {\n id: run.id,\n workflow_name: run.name,\n conclusion: run.conclusion ?? 'unknown',\n status: run.status,\n branch: run.head_branch ?? '',\n actor: run.actor?.login ?? '',\n run_attempt: run.run_attempt,\n },\n });\n }\n return;\n }\n\n const cutoff = request.since ? new Date(request.since).getTime() : null;\n const allEvents: Parameters<StorageHandle['events']>[0] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/actions/runs?per_page=100&page=${page}`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const data = (await res.json()) as GitHubRunsResponse;\n const runs = data.workflow_runs;\n if (runs.length === 0) {\n break;\n }\n\n for (const run of runs) {\n const createdMs = new Date(run.created_at).getTime();\n const updatedMs = new Date(run.updated_at).getTime();\n if (cutoff !== null && createdMs < cutoff && updatedMs < cutoff) {\n continue;\n }\n allEvents.push({\n name: 'workflow_run',\n start_ts: createdMs,\n end_ts: updatedMs,\n attributes: {\n id: run.id,\n workflow_name: run.name,\n conclusion: run.conclusion ?? 'unknown',\n status: run.status,\n branch: run.head_branch ?? '',\n actor: run.actor?.login ?? '',\n run_attempt: run.run_attempt,\n },\n });\n }\n\n const lastRun = runs.at(-1)!;\n if (\n cutoff !== null &&\n new Date(lastRun.created_at).getTime() < cutoff &&\n new Date(lastRun.updated_at).getTime() < cutoff\n ) {\n break;\n }\n page++;\n }\n\n await storage.events(allEvents, { names: ['workflow_run'] });\n }\n\n private async syncPullRequests(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const allPRs: GitHubPR[] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/pulls?state=open&per_page=100&page=${page}`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const prs = (await res.json()) as GitHubPR[];\n if (prs.length === 0) {\n break;\n }\n allPRs.push(...prs);\n if (prs.length < 100) {\n break;\n }\n page++;\n }\n\n await storage.entities(\n allPRs.map((pr) => ({\n type: 'pull_request',\n id: String(pr.number),\n attributes: {\n title: pr.title,\n state: pr.state,\n draft: pr.draft,\n author: pr.user.login,\n created_at: new Date(pr.created_at).getTime(),\n },\n updated_at: new Date(pr.updated_at).getTime(),\n })),\n { types: ['pull_request'] },\n );\n\n const reviewEdges: Parameters<StorageHandle['edges']>[0] = [];\n for (const pr of allPRs) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/pulls/${pr.number}/reviews`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(\n `GitHub API error fetching reviews for PR #${pr.number}: ${res.status} ${res.statusText}`,\n );\n }\n const reviews = (await res.json()) as GitHubReview[];\n for (const review of reviews) {\n if (!review.user) {\n continue;\n }\n reviewEdges.push({\n from_type: 'pull_request',\n from_id: String(pr.number),\n kind: 'reviewed_by',\n to_type: 'user',\n to_id: review.user.login,\n attributes: {\n state: review.state,\n },\n updated_at: new Date(review.submitted_at).getTime(),\n });\n }\n }\n\n await storage.edges(reviewEdges, { kinds: ['reviewed_by'] });\n }\n\n private async syncIssues(\n storage: StorageHandle,\n request: SyncRequest,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const allIssues: GitHubIssue[] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const url = new URL(\n `https://api.github.com/repos/${owner}/${repo}/issues`,\n );\n url.searchParams.set('state', 'all');\n url.searchParams.set('per_page', '100');\n url.searchParams.set('page', String(page));\n if (request.since) {\n url.searchParams.set('since', request.since);\n }\n const res = await fetch(url.toString(), { headers, signal });\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const issues = (await res.json()) as GitHubIssue[];\n if (issues.length === 0) {\n break;\n }\n for (const issue of issues) {\n if (issue.pull_request !== undefined) {\n continue;\n }\n allIssues.push(issue);\n }\n if (issues.length < 100) {\n break;\n }\n page++;\n }\n\n await storage.entities(\n allIssues.map((issue) => ({\n type: 'issue',\n id: String(issue.number),\n attributes: {\n number: issue.number,\n title: issue.title,\n state: issue.state,\n labels: issue.labels.map((l) => l.name),\n assignees: issue.assignees.map((a) => a.login),\n author: issue.user.login,\n created_at: new Date(issue.created_at).getTime(),\n updated_at: new Date(issue.updated_at).getTime(),\n closed_at: issue.closed_at\n ? new Date(issue.closed_at).getTime()\n : null,\n },\n updated_at: new Date(issue.updated_at).getTime(),\n })),\n { types: ['issue'] },\n );\n }\n\n private async syncDeployments(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const allDeployments: GitHubDeployment[] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/deployments?per_page=100&page=${page}`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const deployments = (await res.json()) as GitHubDeployment[];\n if (deployments.length === 0) {\n break;\n }\n allDeployments.push(...deployments);\n if (deployments.length < 100) {\n break;\n }\n page++;\n }\n\n const entities: Parameters<StorageHandle['entities']>[0] = [];\n for (const deployment of allDeployments) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/deployments/${deployment.id}/statuses?per_page=1`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const statuses = (await res.json()) as GitHubDeploymentStatus[];\n const createdMs = new Date(deployment.created_at).getTime();\n const statusUpdatedMs = statuses[0]?.updated_at\n ? new Date(statuses[0].updated_at).getTime()\n : null;\n entities.push({\n type: 'deployment',\n id: String(deployment.id),\n attributes: {\n environment: deployment.environment,\n ref: deployment.ref,\n sha: deployment.sha,\n creator: deployment.creator?.login ?? '',\n created_at: createdMs,\n latest_status: statuses[0]?.state ?? 'unknown',\n },\n updated_at: Math.max(createdMs, statusUpdatedMs ?? 0),\n });\n }\n\n await storage.entities(entities, { types: ['deployment'] });\n }\n\n private async syncReleases(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const allReleases: GitHubRelease[] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/releases?per_page=100&page=${page}`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const releases = (await res.json()) as GitHubRelease[];\n if (releases.length === 0) {\n break;\n }\n allReleases.push(...releases);\n if (releases.length < 100) {\n break;\n }\n page++;\n }\n\n await storage.entities(\n allReleases.map((release) => ({\n type: 'release',\n id: String(release.id),\n attributes: {\n tag_name: release.tag_name,\n name: release.name ?? '',\n draft: release.draft,\n prerelease: release.prerelease,\n created_at: new Date(release.created_at).getTime(),\n published_at: release.published_at\n ? new Date(release.published_at).getTime()\n : null,\n author: release.author.login,\n },\n updated_at: new Date(\n release.published_at ?? release.created_at,\n ).getTime(),\n })),\n { types: ['release'] },\n );\n }\n\n private async syncContributors(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n\n let contributors: GitHubContributorStats[] | null = null;\n for (let attempt = 0; attempt < 5; attempt++) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/stats/contributors`,\n { headers, signal },\n );\n if (res.status === 202) {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, 3000);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error('Aborted'));\n },\n { once: true },\n );\n });\n continue;\n }\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n contributors = (await res.json()) as GitHubContributorStats[];\n break;\n }\n\n if (!contributors) {\n return;\n }\n\n await storage.entities(\n contributors.map((c) => {\n const additions = c.weeks.reduce((sum, w) => sum + w.a, 0);\n const deletions = c.weeks.reduce((sum, w) => sum + w.d, 0);\n const latestWeek = [...c.weeks].reverse().find((w) => w.c > 0);\n return {\n type: 'contributor',\n id: c.author.login,\n attributes: {\n commits: c.total,\n additions,\n deletions,\n latest_commit_at: latestWeek ? latestWeek.w * 1000 : null,\n },\n updated_at: latestWeek ? latestWeek.w * 1000 : 0,\n };\n }),\n { types: ['contributor'] },\n );\n }\n\n async sync(\n request: SyncRequest,\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n await this.syncWorkflowRuns(storage, request, signal);\n await this.syncPullRequests(storage, signal);\n await this.syncIssues(storage, request, signal);\n await this.syncDeployments(storage, signal);\n await this.syncReleases(storage, signal);\n await this.syncContributors(storage, signal);\n }\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAIA;AAAA,OACK;AACP,SAAS,SAAS;AAEX,IAAM,eAAe;AAAA,EAC1B,EAAE,OAAO;AAAA,IACP,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK;AAAA,MAC5B,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,IACf,CAAC;AAAA,IACD,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK;AAAA,MAC3B,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,IACf,CAAC;AAAA,IACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK;AAAA,MACvD,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH;AAiFA,IAAM,oBAAoB;AAAA,EACxB,OAAO;AAAA,IACL,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;AAIO,IAAM,yBAAN,MAAM,gCAA+B,cAG1C;AAAA,EACA,OAAgB,KAAK;AAAA,EAErB,OAAO,OAAO,OAAwC;AACpD,UAAM,SAAS,aAAa,MAAM,KAAK;AACvC,WAAO,IAAI;AAAA,MACT,EAAE,OAAO,OAAO,OAAO,MAAM,OAAO,KAAK;AAAA,MACzC,EAAE,OAAO,OAAO,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAES,KAAK;AAAA,EAEI,cAAc;AAAA,EAExB,eAAuC;AAC7C,UAAM,UAAkC;AAAA,MACtC,QAAQ;AAAA,MACR,wBAAwB;AAAA,IAC1B;AACA,QAAI,KAAK,MAAM,OAAO;AACpB,cAAQ,eAAe,IAAI,UAAU,KAAK,MAAM,KAAK;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBACZ,SACA,SACA,QACe;AACf,UAAM,EAAE,OAAO,KAAK,IAAI,KAAK;AAC7B,UAAM,UAAU,KAAK,aAAa;AAElC,QAAI,QAAQ,SAAS,UAAU;AAC7B,YAAM,MAAM,MAAM;AAAA,QAChB,gCAAgC,KAAK,IAAI,IAAI;AAAA,QAC7C,EAAE,SAAS,OAAO;AAAA,MACpB;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MACrE;AACA,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,YAAM,MAAM,KAAK,cAAc,CAAC;AAChC,UAAI,KAAK;AACP,cAAM,QAAQ,MAAM;AAAA,UAClB,MAAM;AAAA,UACN,UAAU,IAAI,KAAK,IAAI,UAAU,EAAE,QAAQ;AAAA,UAC3C,QAAQ,IAAI,KAAK,IAAI,UAAU,EAAE,QAAQ;AAAA,UACzC,YAAY;AAAA,YACV,IAAI,IAAI;AAAA,YACR,eAAe,IAAI;AAAA,YACnB,YAAY,IAAI,cAAc;AAAA,YAC9B,QAAQ,IAAI;AAAA,YACZ,QAAQ,IAAI,eAAe;AAAA,YAC3B,OAAO,IAAI,OAAO,SAAS;AAAA,YAC3B,aAAa,IAAI;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,QAAQ,IAAI,KAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI;AACnE,UAAM,YAAoD,CAAC;AAC3D,QAAI,OAAO;AAEX,WAAO,MAAM;AACX,cAAQ,eAAe;AACvB,YAAM,MAAM,MAAM;AAAA,QAChB,gCAAgC,KAAK,IAAI,IAAI,mCAAmC,IAAI;AAAA,QACpF,EAAE,SAAS,OAAO;AAAA,MACpB;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MACrE;AACA,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,YAAM,OAAO,KAAK;AAClB,UAAI,KAAK,WAAW,GAAG;AACrB;AAAA,MACF;AAEA,iBAAW,OAAO,MAAM;AACtB,cAAM,YAAY,IAAI,KAAK,IAAI,UAAU,EAAE,QAAQ;AACnD,cAAM,YAAY,IAAI,KAAK,IAAI,UAAU,EAAE,QAAQ;AACnD,YAAI,WAAW,QAAQ,YAAY,UAAU,YAAY,QAAQ;AAC/D;AAAA,QACF;AACA,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY;AAAA,YACV,IAAI,IAAI;AAAA,YACR,eAAe,IAAI;AAAA,YACnB,YAAY,IAAI,cAAc;AAAA,YAC9B,QAAQ,IAAI;AAAA,YACZ,QAAQ,IAAI,eAAe;AAAA,YAC3B,OAAO,IAAI,OAAO,SAAS;AAAA,YAC3B,aAAa,IAAI;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AAEA,YAAM,UAAU,KAAK,GAAG,EAAE;AAC1B,UACE,WAAW,QACX,IAAI,KAAK,QAAQ,UAAU,EAAE,QAAQ,IAAI,UACzC,IAAI,KAAK,QAAQ,UAAU,EAAE,QAAQ,IAAI,QACzC;AACA;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,QAAQ,OAAO,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAc,iBACZ,SACA,QACe;AACf,UAAM,EAAE,OAAO,KAAK,IAAI,KAAK;AAC7B,UAAM,UAAU,KAAK,aAAa;AAClC,UAAM,SAAqB,CAAC;AAC5B,QAAI,OAAO;AAEX,WAAO,MAAM;AACX,cAAQ,eAAe;AACvB,YAAM,MAAM,MAAM;AAAA,QAChB,gCAAgC,KAAK,IAAI,IAAI,uCAAuC,IAAI;AAAA,QACxF,EAAE,SAAS,OAAO;AAAA,MACpB;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MACrE;AACA,YAAM,MAAO,MAAM,IAAI,KAAK;AAC5B,UAAI,IAAI,WAAW,GAAG;AACpB;AAAA,MACF;AACA,aAAO,KAAK,GAAG,GAAG;AAClB,UAAI,IAAI,SAAS,KAAK;AACpB;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,OAAO,IAAI,CAAC,QAAQ;AAAA,QAClB,MAAM;AAAA,QACN,IAAI,OAAO,GAAG,MAAM;AAAA,QACpB,YAAY;AAAA,UACV,OAAO,GAAG;AAAA,UACV,OAAO,GAAG;AAAA,UACV,OAAO,GAAG;AAAA,UACV,QAAQ,GAAG,KAAK;AAAA,UAChB,YAAY,IAAI,KAAK,GAAG,UAAU,EAAE,QAAQ;AAAA,QAC9C;AAAA,QACA,YAAY,IAAI,KAAK,GAAG,UAAU,EAAE,QAAQ;AAAA,MAC9C,EAAE;AAAA,MACF,EAAE,OAAO,CAAC,cAAc,EAAE;AAAA,IAC5B;AAEA,UAAM,cAAqD,CAAC;AAC5D,eAAW,MAAM,QAAQ;AACvB,cAAQ,eAAe;AACvB,YAAM,MAAM,MAAM;AAAA,QAChB,gCAAgC,KAAK,IAAI,IAAI,UAAU,GAAG,MAAM;AAAA,QAChE,EAAE,SAAS,OAAO;AAAA,MACpB;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI;AAAA,UACR,6CAA6C,GAAG,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,QACzF;AAAA,MACF;AACA,YAAM,UAAW,MAAM,IAAI,KAAK;AAChC,iBAAW,UAAU,SAAS;AAC5B,YAAI,CAAC,OAAO,MAAM;AAChB;AAAA,QACF;AACA,oBAAY,KAAK;AAAA,UACf,WAAW;AAAA,UACX,SAAS,OAAO,GAAG,MAAM;AAAA,UACzB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,OAAO,OAAO,KAAK;AAAA,UACnB,YAAY;AAAA,YACV,OAAO,OAAO;AAAA,UAChB;AAAA,UACA,YAAY,IAAI,KAAK,OAAO,YAAY,EAAE,QAAQ;AAAA,QACpD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAc,WACZ,SACA,SACA,QACe;AACf,UAAM,EAAE,OAAO,KAAK,IAAI,KAAK;AAC7B,UAAM,UAAU,KAAK,aAAa;AAClC,UAAM,YAA2B,CAAC;AAClC,QAAI,OAAO;AAEX,WAAO,MAAM;AACX,cAAQ,eAAe;AACvB,YAAM,MAAM,IAAI;AAAA,QACd,gCAAgC,KAAK,IAAI,IAAI;AAAA,MAC/C;AACA,UAAI,aAAa,IAAI,SAAS,KAAK;AACnC,UAAI,aAAa,IAAI,YAAY,KAAK;AACtC,UAAI,aAAa,IAAI,QAAQ,OAAO,IAAI,CAAC;AACzC,UAAI,QAAQ,OAAO;AACjB,YAAI,aAAa,IAAI,SAAS,QAAQ,KAAK;AAAA,MAC7C;AACA,YAAM,MAAM,MAAM,MAAM,IAAI,SAAS,GAAG,EAAE,SAAS,OAAO,CAAC;AAC3D,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MACrE;AACA,YAAM,SAAU,MAAM,IAAI,KAAK;AAC/B,UAAI,OAAO,WAAW,GAAG;AACvB;AAAA,MACF;AACA,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,iBAAiB,QAAW;AACpC;AAAA,QACF;AACA,kBAAU,KAAK,KAAK;AAAA,MACtB;AACA,UAAI,OAAO,SAAS,KAAK;AACvB;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,UAAU,IAAI,CAAC,WAAW;AAAA,QACxB,MAAM;AAAA,QACN,IAAI,OAAO,MAAM,MAAM;AAAA,QACvB,YAAY;AAAA,UACV,QAAQ,MAAM;AAAA,UACd,OAAO,MAAM;AAAA,UACb,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,UACtC,WAAW,MAAM,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,UAC7C,QAAQ,MAAM,KAAK;AAAA,UACnB,YAAY,IAAI,KAAK,MAAM,UAAU,EAAE,QAAQ;AAAA,UAC/C,YAAY,IAAI,KAAK,MAAM,UAAU,EAAE,QAAQ;AAAA,UAC/C,WAAW,MAAM,YACb,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ,IAClC;AAAA,QACN;AAAA,QACA,YAAY,IAAI,KAAK,MAAM,UAAU,EAAE,QAAQ;AAAA,MACjD,EAAE;AAAA,MACF,EAAE,OAAO,CAAC,OAAO,EAAE;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,SACA,QACe;AACf,UAAM,EAAE,OAAO,KAAK,IAAI,KAAK;AAC7B,UAAM,UAAU,KAAK,aAAa;AAClC,UAAM,iBAAqC,CAAC;AAC5C,QAAI,OAAO;AAEX,WAAO,MAAM;AACX,cAAQ,eAAe;AACvB,YAAM,MAAM,MAAM;AAAA,QAChB,gCAAgC,KAAK,IAAI,IAAI,kCAAkC,IAAI;AAAA,QACnF,EAAE,SAAS,OAAO;AAAA,MACpB;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MACrE;AACA,YAAM,cAAe,MAAM,IAAI,KAAK;AACpC,UAAI,YAAY,WAAW,GAAG;AAC5B;AAAA,MACF;AACA,qBAAe,KAAK,GAAG,WAAW;AAClC,UAAI,YAAY,SAAS,KAAK;AAC5B;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,WAAqD,CAAC;AAC5D,eAAW,cAAc,gBAAgB;AACvC,cAAQ,eAAe;AACvB,YAAM,MAAM,MAAM;AAAA,QAChB,gCAAgC,KAAK,IAAI,IAAI,gBAAgB,WAAW,EAAE;AAAA,QAC1E,EAAE,SAAS,OAAO;AAAA,MACpB;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MACrE;AACA,YAAM,WAAY,MAAM,IAAI,KAAK;AACjC,YAAM,YAAY,IAAI,KAAK,WAAW,UAAU,EAAE,QAAQ;AAC1D,YAAM,kBAAkB,SAAS,CAAC,GAAG,aACjC,IAAI,KAAK,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,IACzC;AACJ,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,IAAI,OAAO,WAAW,EAAE;AAAA,QACxB,YAAY;AAAA,UACV,aAAa,WAAW;AAAA,UACxB,KAAK,WAAW;AAAA,UAChB,KAAK,WAAW;AAAA,UAChB,SAAS,WAAW,SAAS,SAAS;AAAA,UACtC,YAAY;AAAA,UACZ,eAAe,SAAS,CAAC,GAAG,SAAS;AAAA,QACvC;AAAA,QACA,YAAY,KAAK,IAAI,WAAW,mBAAmB,CAAC;AAAA,MACtD,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ,SAAS,UAAU,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAc,aACZ,SACA,QACe;AACf,UAAM,EAAE,OAAO,KAAK,IAAI,KAAK;AAC7B,UAAM,UAAU,KAAK,aAAa;AAClC,UAAM,cAA+B,CAAC;AACtC,QAAI,OAAO;AAEX,WAAO,MAAM;AACX,cAAQ,eAAe;AACvB,YAAM,MAAM,MAAM;AAAA,QAChB,gCAAgC,KAAK,IAAI,IAAI,+BAA+B,IAAI;AAAA,QAChF,EAAE,SAAS,OAAO;AAAA,MACpB;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MACrE;AACA,YAAM,WAAY,MAAM,IAAI,KAAK;AACjC,UAAI,SAAS,WAAW,GAAG;AACzB;AAAA,MACF;AACA,kBAAY,KAAK,GAAG,QAAQ;AAC5B,UAAI,SAAS,SAAS,KAAK;AACzB;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,YAAY,IAAI,CAAC,aAAa;AAAA,QAC5B,MAAM;AAAA,QACN,IAAI,OAAO,QAAQ,EAAE;AAAA,QACrB,YAAY;AAAA,UACV,UAAU,QAAQ;AAAA,UAClB,MAAM,QAAQ,QAAQ;AAAA,UACtB,OAAO,QAAQ;AAAA,UACf,YAAY,QAAQ;AAAA,UACpB,YAAY,IAAI,KAAK,QAAQ,UAAU,EAAE,QAAQ;AAAA,UACjD,cAAc,QAAQ,eAClB,IAAI,KAAK,QAAQ,YAAY,EAAE,QAAQ,IACvC;AAAA,UACJ,QAAQ,QAAQ,OAAO;AAAA,QACzB;AAAA,QACA,YAAY,IAAI;AAAA,UACd,QAAQ,gBAAgB,QAAQ;AAAA,QAClC,EAAE,QAAQ;AAAA,MACZ,EAAE;AAAA,MACF,EAAE,OAAO,CAAC,SAAS,EAAE;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,SACA,QACe;AACf,UAAM,EAAE,OAAO,KAAK,IAAI,KAAK;AAC7B,UAAM,UAAU,KAAK,aAAa;AAElC,QAAI,eAAgD;AACpD,aAAS,UAAU,GAAG,UAAU,GAAG,WAAW;AAC5C,cAAQ,eAAe;AACvB,YAAM,MAAM,MAAM;AAAA,QAChB,gCAAgC,KAAK,IAAI,IAAI;AAAA,QAC7C,EAAE,SAAS,OAAO;AAAA,MACpB;AACA,UAAI,IAAI,WAAW,KAAK;AACtB,cAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,gBAAM,QAAQ,WAAW,SAAS,GAAI;AACtC,kBAAQ;AAAA,YACN;AAAA,YACA,MAAM;AACJ,2BAAa,KAAK;AAClB,qBAAO,OAAO,UAAU,IAAI,MAAM,SAAS,CAAC;AAAA,YAC9C;AAAA,YACA,EAAE,MAAM,KAAK;AAAA,UACf;AAAA,QACF,CAAC;AACD;AAAA,MACF;AACA,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MACrE;AACA,qBAAgB,MAAM,IAAI,KAAK;AAC/B;AAAA,IACF;AAEA,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,aAAa,IAAI,CAAC,MAAM;AACtB,cAAM,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,GAAG,CAAC;AACzD,cAAM,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,GAAG,CAAC;AACzD,cAAM,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;AAC7D,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,EAAE,OAAO;AAAA,UACb,YAAY;AAAA,YACV,SAAS,EAAE;AAAA,YACX;AAAA,YACA;AAAA,YACA,kBAAkB,aAAa,WAAW,IAAI,MAAO;AAAA,UACvD;AAAA,UACA,YAAY,aAAa,WAAW,IAAI,MAAO;AAAA,QACjD;AAAA,MACF,CAAC;AAAA,MACD,EAAE,OAAO,CAAC,aAAa,EAAE;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,SACA,SACA,QACe;AACf,UAAM,KAAK,iBAAiB,SAAS,SAAS,MAAM;AACpD,UAAM,KAAK,iBAAiB,SAAS,MAAM;AAC3C,UAAM,KAAK,WAAW,SAAS,SAAS,MAAM;AAC9C,UAAM,KAAK,gBAAgB,SAAS,MAAM;AAC1C,UAAM,KAAK,aAAa,SAAS,MAAM;AACvC,UAAM,KAAK,iBAAiB,SAAS,MAAM;AAAA,EAC7C;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/github-actions.ts"],"sourcesContent":["import {\n BaseConnector,\n type CredentialSchema,\n type StorageHandle,\n type SyncRequest,\n defineConfigFields,\n} from '@rawdash/core';\nimport { z } from 'zod';\n\nexport const configFields = defineConfigFields(\n z.object({\n owner: z.string().min(1).meta({\n label: 'Repository owner',\n description: 'GitHub username or organization name.',\n placeholder: 'rawdash',\n }),\n repo: z.string().min(1).meta({\n label: 'Repository',\n description: 'Repository name.',\n placeholder: 'rawdash',\n }),\n token: z.object({ $secret: z.string() }).optional().meta({\n label: 'Personal access token',\n description: 'GitHub PAT with `repo` scope.',\n secret: true,\n }),\n }),\n);\n\nexport interface GitHubActionsSettings {\n owner: string;\n repo: string;\n}\n\ninterface GitHubRunsResponse {\n workflow_runs: Array<{\n id: number;\n name: string;\n conclusion: string | null;\n status: string;\n head_branch: string | null;\n actor: { login: string } | null;\n created_at: string;\n updated_at: string;\n run_attempt: number;\n }>;\n}\n\ninterface GitHubPR {\n number: number;\n title: string;\n state: string;\n draft: boolean;\n user: { login: string };\n created_at: string;\n updated_at: string;\n}\n\ninterface GitHubReview {\n user: { login: string } | null;\n state: string;\n submitted_at: string;\n}\n\ninterface GitHubIssue {\n number: number;\n title: string;\n state: string;\n labels: Array<{ name: string }>;\n assignees: Array<{ login: string }>;\n user: { login: string };\n created_at: string;\n updated_at: string;\n closed_at: string | null;\n pull_request?: unknown;\n}\n\ninterface GitHubDeployment {\n id: number;\n environment: string;\n ref: string;\n sha: string;\n creator: { login: string } | null;\n created_at: string;\n}\n\ninterface GitHubDeploymentStatus {\n state: string;\n updated_at: string;\n}\n\ninterface GitHubRelease {\n id: number;\n tag_name: string;\n name: string | null;\n draft: boolean;\n prerelease: boolean;\n created_at: string;\n published_at: string | null;\n author: { login: string };\n}\n\ninterface GitHubContributorStats {\n total: number;\n weeks: Array<{ w: number; a: number; d: number; c: number }>;\n author: { login: string };\n}\n\ninterface GitHubRepo {\n stargazers_count: number;\n forks_count: number;\n subscribers_count: number;\n}\n\nconst githubCredentials = {\n token: {\n description: 'GitHub personal access token',\n auth: 'optional' as const,\n },\n} satisfies CredentialSchema;\n\ntype GitHubCredentials = typeof githubCredentials;\n\nexport class GitHubActionsConnector extends BaseConnector<\n GitHubActionsSettings,\n GitHubCredentials\n> {\n static readonly id = 'github-actions';\n\n static create(input: unknown): GitHubActionsConnector {\n const parsed = configFields.parse(input);\n return new GitHubActionsConnector(\n { owner: parsed.owner, repo: parsed.repo },\n { token: parsed.token },\n );\n }\n\n readonly id = 'github-actions';\n\n override readonly credentials = githubCredentials;\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n };\n if (this.creds.token) {\n headers['Authorization'] = `Bearer ${this.creds.token}`;\n }\n return headers;\n }\n\n private async syncWorkflowRuns(\n storage: StorageHandle,\n request: SyncRequest,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n\n if (request.mode === 'latest') {\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/actions/runs?per_page=1`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const data = (await res.json()) as GitHubRunsResponse;\n const run = data.workflow_runs[0];\n if (run) {\n await storage.event({\n name: 'workflow_run',\n start_ts: new Date(run.created_at).getTime(),\n end_ts: new Date(run.updated_at).getTime(),\n attributes: {\n id: run.id,\n workflow_name: run.name,\n conclusion: run.conclusion ?? 'unknown',\n status: run.status,\n branch: run.head_branch ?? '',\n actor: run.actor?.login ?? '',\n run_attempt: run.run_attempt,\n },\n });\n }\n return;\n }\n\n const cutoff = request.since ? new Date(request.since).getTime() : null;\n const allEvents: Parameters<StorageHandle['events']>[0] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/actions/runs?per_page=100&page=${page}`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const data = (await res.json()) as GitHubRunsResponse;\n const runs = data.workflow_runs;\n if (runs.length === 0) {\n break;\n }\n\n for (const run of runs) {\n const createdMs = new Date(run.created_at).getTime();\n const updatedMs = new Date(run.updated_at).getTime();\n if (cutoff !== null && createdMs < cutoff && updatedMs < cutoff) {\n continue;\n }\n allEvents.push({\n name: 'workflow_run',\n start_ts: createdMs,\n end_ts: updatedMs,\n attributes: {\n id: run.id,\n workflow_name: run.name,\n conclusion: run.conclusion ?? 'unknown',\n status: run.status,\n branch: run.head_branch ?? '',\n actor: run.actor?.login ?? '',\n run_attempt: run.run_attempt,\n },\n });\n }\n\n const lastRun = runs.at(-1)!;\n if (\n cutoff !== null &&\n new Date(lastRun.created_at).getTime() < cutoff &&\n new Date(lastRun.updated_at).getTime() < cutoff\n ) {\n break;\n }\n page++;\n }\n\n await storage.events(allEvents, { names: ['workflow_run'] });\n }\n\n private async syncPullRequests(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const allPRs: GitHubPR[] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/pulls?state=all&per_page=100&page=${page}`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const prs = (await res.json()) as GitHubPR[];\n if (prs.length === 0) {\n break;\n }\n allPRs.push(...prs);\n if (prs.length < 100) {\n break;\n }\n page++;\n }\n\n await storage.entities(\n allPRs.map((pr) => ({\n type: 'pull_request',\n id: String(pr.number),\n attributes: {\n title: pr.title,\n state: pr.state,\n draft: pr.draft,\n author: pr.user.login,\n created_at: new Date(pr.created_at).getTime(),\n },\n updated_at: new Date(pr.updated_at).getTime(),\n })),\n { types: ['pull_request'] },\n );\n\n const reviewEdges: Parameters<StorageHandle['edges']>[0] = [];\n for (const pr of allPRs) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/pulls/${pr.number}/reviews`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(\n `GitHub API error fetching reviews for PR #${pr.number}: ${res.status} ${res.statusText}`,\n );\n }\n const reviews = (await res.json()) as GitHubReview[];\n for (const review of reviews) {\n if (!review.user) {\n continue;\n }\n reviewEdges.push({\n from_type: 'pull_request',\n from_id: String(pr.number),\n kind: 'reviewed_by',\n to_type: 'user',\n to_id: review.user.login,\n attributes: {\n state: review.state,\n },\n updated_at: new Date(review.submitted_at).getTime(),\n });\n }\n }\n\n await storage.edges(reviewEdges, { kinds: ['reviewed_by'] });\n }\n\n private async syncIssues(\n storage: StorageHandle,\n request: SyncRequest,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const allIssues: GitHubIssue[] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const url = new URL(\n `https://api.github.com/repos/${owner}/${repo}/issues`,\n );\n url.searchParams.set('state', 'all');\n url.searchParams.set('per_page', '100');\n url.searchParams.set('page', String(page));\n if (request.since) {\n url.searchParams.set('since', request.since);\n }\n const res = await fetch(url.toString(), { headers, signal });\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const issues = (await res.json()) as GitHubIssue[];\n if (issues.length === 0) {\n break;\n }\n for (const issue of issues) {\n if (issue.pull_request !== undefined) {\n continue;\n }\n allIssues.push(issue);\n }\n if (issues.length < 100) {\n break;\n }\n page++;\n }\n\n await storage.entities(\n allIssues.map((issue) => ({\n type: 'issue',\n id: String(issue.number),\n attributes: {\n number: issue.number,\n title: issue.title,\n state: issue.state,\n labels: issue.labels.map((l) => l.name),\n assignees: issue.assignees.map((a) => a.login),\n author: issue.user.login,\n created_at: new Date(issue.created_at).getTime(),\n updated_at: new Date(issue.updated_at).getTime(),\n closed_at: issue.closed_at\n ? new Date(issue.closed_at).getTime()\n : null,\n },\n updated_at: new Date(issue.updated_at).getTime(),\n })),\n { types: ['issue'] },\n );\n }\n\n private async syncDeployments(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const allDeployments: GitHubDeployment[] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/deployments?per_page=100&page=${page}`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const deployments = (await res.json()) as GitHubDeployment[];\n if (deployments.length === 0) {\n break;\n }\n allDeployments.push(...deployments);\n if (deployments.length < 100) {\n break;\n }\n page++;\n }\n\n const entities: Parameters<StorageHandle['entities']>[0] = [];\n for (const deployment of allDeployments) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/deployments/${deployment.id}/statuses?per_page=1`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const statuses = (await res.json()) as GitHubDeploymentStatus[];\n const createdMs = new Date(deployment.created_at).getTime();\n const statusUpdatedMs = statuses[0]?.updated_at\n ? new Date(statuses[0].updated_at).getTime()\n : null;\n entities.push({\n type: 'deployment',\n id: String(deployment.id),\n attributes: {\n environment: deployment.environment,\n ref: deployment.ref,\n sha: deployment.sha,\n creator: deployment.creator?.login ?? '',\n created_at: createdMs,\n latest_status: statuses[0]?.state ?? 'unknown',\n },\n updated_at: Math.max(createdMs, statusUpdatedMs ?? 0),\n });\n }\n\n await storage.entities(entities, { types: ['deployment'] });\n }\n\n private async syncReleases(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const allReleases: GitHubRelease[] = [];\n let page = 1;\n\n while (true) {\n signal?.throwIfAborted();\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/releases?per_page=100&page=${page}`,\n { headers, signal },\n );\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const releases = (await res.json()) as GitHubRelease[];\n if (releases.length === 0) {\n break;\n }\n allReleases.push(...releases);\n if (releases.length < 100) {\n break;\n }\n page++;\n }\n\n await storage.entities(\n allReleases.map((release) => ({\n type: 'release',\n id: String(release.id),\n attributes: {\n tag_name: release.tag_name,\n name: release.name ?? '',\n draft: release.draft,\n prerelease: release.prerelease,\n created_at: new Date(release.created_at).getTime(),\n published_at: release.published_at\n ? new Date(release.published_at).getTime()\n : null,\n author: release.author.login,\n },\n updated_at: new Date(\n release.published_at ?? release.created_at,\n ).getTime(),\n })),\n { types: ['release'] },\n );\n }\n\n private async syncContributors(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n\n const contributors = await this.withRetry<GitHubContributorStats[]>(\n async (sig) => {\n const res = await fetch(\n `https://api.github.com/repos/${owner}/${repo}/stats/contributors`,\n { headers, signal: sig },\n );\n if (res.status === 202) {\n return { status: 'retry' };\n }\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n return {\n status: 'done',\n value: (await res.json()) as GitHubContributorStats[],\n };\n },\n { maxAttempts: 15, initialDelayMs: 1000, maxDelayMs: 10000, signal },\n );\n\n if (!contributors || contributors.length === 0) {\n if (!contributors) {\n console.warn(\n '[github-actions] Stats endpoint never became ready — skipping contributor sync and keeping previous data.',\n );\n }\n return;\n }\n\n await storage.entities(\n contributors.map((c) => {\n const additions = c.weeks.reduce((sum, w) => sum + w.a, 0);\n const deletions = c.weeks.reduce((sum, w) => sum + w.d, 0);\n const latestWeek = [...c.weeks].reverse().find((w) => w.c > 0);\n return {\n type: 'contributor',\n id: c.author.login,\n attributes: {\n commits: c.total,\n additions,\n deletions,\n latest_commit_at: latestWeek ? latestWeek.w * 1000 : null,\n },\n updated_at: latestWeek ? latestWeek.w * 1000 : 0,\n };\n }),\n { types: ['contributor'] },\n );\n }\n\n private async syncRepoStats(\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n const { owner, repo } = this.settings;\n const headers = this.buildHeaders();\n const res = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {\n headers,\n signal,\n });\n if (!res.ok) {\n throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);\n }\n const data = (await res.json()) as GitHubRepo;\n await storage.entities(\n [\n {\n type: 'repo',\n id: `${owner}/${repo}`,\n attributes: {\n stars: data.stargazers_count,\n forks: data.forks_count,\n watchers: data.subscribers_count,\n },\n updated_at: Date.now(),\n },\n ],\n { types: ['repo'] },\n );\n }\n\n async sync(\n request: SyncRequest,\n storage: StorageHandle,\n signal?: AbortSignal,\n ): Promise<void> {\n await this.syncRepoStats(storage, signal);\n await this.syncWorkflowRuns(storage, request, signal);\n await this.syncPullRequests(storage, signal);\n await this.syncIssues(storage, request, signal);\n await this.syncDeployments(storage, signal);\n await this.syncReleases(storage, signal);\n await this.syncContributors(storage, signal);\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rawdash/connector-github",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Rawdash connector for GitHub Actions",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"zod": "^4.4.3",
|
|
26
|
-
"@rawdash/core": "0.1.
|
|
26
|
+
"@rawdash/core": "0.1.1"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"tsup": "^8.0.0",
|