-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgithub-stats.ts
More file actions
61 lines (53 loc) · 2.1 KB
/
github-stats.ts
File metadata and controls
61 lines (53 loc) · 2.1 KB
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
#!/usr/bin/env bun
import { $ } from "bun";
// 1. ログインユーザー名を自動取得(USERNAMEが空の場合)
let targetUser = "";
if (!targetUser) {
const nameResponse = await $`gh api user --jq .login`.quiet();
targetUser = nameResponse.stdout.toString().trim();
}
// 2. GraphQLクエリ
const query = `
query($userName: String!) {
user(login: $userName) {
contributionsCollection {
contributionCalendar {
weeks {
contributionDays {
contributionCount
date
}
}
}
}
}
}`;
try {
// 3. gh api 実行
// stdoutだけを確実に取得し、不要な空白をtrimする
const response = await $`gh api graphql -f query=${query} -f userName=${targetUser}`.text();
const data = JSON.parse(response);
if (!data.data?.user) {
throw new Error("ユーザーデータが見つかりませんでした。");
}
// 4. データを平坦化して日付順にソート
const days = data.data.user.contributionsCollection.contributionCalendar.weeks
.flatMap((w: any) => w.contributionDays)
.sort((a: any, b: any) => new Date(b.date).getTime() - new Date(a.date).getTime());
// 5. 集計
const today = days[0]?.contributionCount ?? 0;
const yesterday = days[1]?.contributionCount ?? 0;
const twodaysAgo = days[2]?.contributionCount ?? 0;
const last7Days = days.slice(0, 7).reduce((acc: number, d: any) => acc + d.contributionCount, 0);
// 6. 結果表示
console.log(`\n📊 GitHub Stats for @${targetUser}`);
console.log(`────────────────────────────`);
console.log(`Today: ${today.toString().padStart(3)} 🟢`);
console.log(`Yesterday: ${yesterday.toString().padStart(3)}`);
console.log(`2 Days Ago: ${twodaysAgo.toString().padStart(3)}`);
console.log(`Last 7 Days: ${last7Days.toString().padStart(3)}`);
console.log(`────────────────────────────\n`);
} catch (err) {
console.error("❌ エラーが発生しました:");
console.error(err instanceof Error ? err.message : err);
}