github-lang-stats 1.4.0 → 1.5.0
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/README.md +78 -15
- package/dist/aggregator.d.ts +2 -2
- package/dist/aggregator.d.ts.map +1 -1
- package/dist/aggregator.js +38 -12
- package/dist/aggregator.js.map +1 -1
- package/dist/cache.d.ts +5 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +29 -3
- package/dist/cache.js.map +1 -1
- package/dist/github-client.d.ts +1 -0
- package/dist/github-client.d.ts.map +1 -1
- package/dist/github-client.js +39 -2
- package/dist/github-client.js.map +1 -1
- package/dist/index.js +96 -36
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +49 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +68 -3
- package/dist/lib.js.map +1 -1
- package/dist/types.d.ts +14 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,16 +4,36 @@ CLI that computes **per-author** GitHub language statistics by inspecting the fi
|
|
|
4
4
|
|
|
5
5
|
Unlike `GET /repos/{owner}/{repo}/languages` (which returns repo-wide bytes regardless of who wrote them), this tool only counts lines in files **you personally changed**.
|
|
6
6
|
|
|
7
|
+
## Why use this instead of your GitHub profile?
|
|
8
|
+
|
|
9
|
+
GitHub's default profile has two major limitations:
|
|
10
|
+
|
|
11
|
+
### 1. **No language-specific contribution stats**
|
|
12
|
+
GitHub shows your total contributions but doesn't break them down by programming language. This tool gives you accurate, per-language statistics based on your actual code changes.
|
|
13
|
+
|
|
14
|
+
### 2. **Private repository contributions are invisible**
|
|
15
|
+
Your GitHub profile only displays contributions to public repositories. For developers working primarily on private codebases (common in professional settings), this misrepresents your actual activity.
|
|
16
|
+
|
|
17
|
+
**This tool solves both problems:**
|
|
18
|
+
- ✅ **Accurate language breakdown** — See exactly how many lines you've changed in TypeScript, Python, Go, etc.
|
|
19
|
+
- ✅ **Safe private repo representation** — Generate aggregate statistics from private repositories without exposing sensitive code or repository names (you control what gets shared in the output)
|
|
20
|
+
- ✅ **Verifiable with your own GitHub token** — Anyone can validate the data by running the tool themselves with their own credentials
|
|
21
|
+
|
|
22
|
+
Perfect for portfolios, resumes, and demonstrating your real technical expertise.
|
|
23
|
+
|
|
7
24
|
## How it works
|
|
8
25
|
|
|
9
|
-
| Phase | API | Cost |
|
|
10
|
-
|
|
11
|
-
| 1. Discover repos | GraphQL `contributionsCollection` | ~20 calls (one per year) |
|
|
12
|
-
| 2. Collect commit SHAs per repo | GraphQL `history(author: ...)` | ~1 call per 100 commits |
|
|
13
|
-
| 3. Fetch per-commit file details | REST `GET /repos/:owner/:repo/commits/:sha` | 1 call per commit |
|
|
26
|
+
| Phase | API | Cost | Rate Limit |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| 1. Discover repos | GraphQL `contributionsCollection` | ~20 calls (one per year) | 5,000/hr |
|
|
29
|
+
| 2. Collect commit SHAs per repo | GraphQL `history(author: ...)` | ~1 call per 100 commits | 5,000/hr |
|
|
30
|
+
| 3. Fetch per-commit file details | REST `GET /repos/:owner/:repo/commits/:sha` | 1 call per commit | 5,000/hr |
|
|
31
|
+
| 4. Collect PR counts (optional) | REST Search API `GET /search/issues` | 1 call per repo | **30/min** |
|
|
14
32
|
|
|
15
33
|
Progress is cached in `.github-lang-stats-cache/<user>.json` so **interrupted runs resume from where they left off**.
|
|
16
34
|
|
|
35
|
+
**Note**: PR counts are collected by default starting with Phase 4. Use `--exclude-pr-counts` to skip this phase if you don't need PR data. The Search API has a stricter rate limit (30 requests/minute), so PR collection includes automatic 2-second delays between requests.
|
|
36
|
+
|
|
17
37
|
## Metric: `lines_changed`
|
|
18
38
|
|
|
19
39
|
For each file in each commit we count `additions + deletions`. This is a proxy for "language activity" — it's not as precise as bytes stored, but it correctly reflects only work you did.
|
|
@@ -59,10 +79,13 @@ const stats = await getGithubLangStats({
|
|
|
59
79
|
cachePath: "./.my-cache/octocat.json", // override default cache location
|
|
60
80
|
useCache: true, // set false to disable caching
|
|
61
81
|
repos: ["octocat/Hello-World"], // restrict to specific repos; omit for all
|
|
82
|
+
includeCommitDates: true, // include commit dates for heatmaps (default: true)
|
|
83
|
+
includePRCounts: true, // include PR counts for activity metrics (default: true)
|
|
62
84
|
onProgress: (e: ProgressEvent) => {
|
|
63
85
|
if (e.phase === "discover") console.log(e.details);
|
|
64
86
|
if (e.phase === "shas") console.log(`${e.repo}: ${e.count} commits`);
|
|
65
87
|
if (e.phase === "details") console.log(`${e.fetched}/${e.total} commits fetched`);
|
|
88
|
+
if (e.phase === "pr-counts") console.log(`${e.fetched}/${e.total} PR counts fetched`);
|
|
66
89
|
if (e.phase === "aggregate") console.log("Aggregating…");
|
|
67
90
|
},
|
|
68
91
|
});
|
|
@@ -70,6 +93,31 @@ const stats = await getGithubLangStats({
|
|
|
70
93
|
console.log(stats.totals); // { TypeScript: 412000, … }
|
|
71
94
|
```
|
|
72
95
|
|
|
96
|
+
#### List repositories only
|
|
97
|
+
|
|
98
|
+
If you just want to get a list of all repositories the user has contributed to (without collecting commit stats):
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { listRepositories } from "github-lang-stats";
|
|
102
|
+
|
|
103
|
+
const repos = await listRepositories({
|
|
104
|
+
token: process.env.GITHUB_TOKEN,
|
|
105
|
+
// Optional fields:
|
|
106
|
+
user: "octocat", // omit to use token's user
|
|
107
|
+
fromYear: 2020, // defaults to 10 years ago
|
|
108
|
+
onProgress: (year) => console.log(`Scanning ${year}...`),
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
console.log(repos);
|
|
112
|
+
// [
|
|
113
|
+
// { owner: "octocat", name: "Hello-World", isPrivate: false },
|
|
114
|
+
// { owner: "octocat", name: "my-private-repo", isPrivate: true },
|
|
115
|
+
// ...
|
|
116
|
+
// ]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This is useful for building UI selectors or filtering repos before running the full analysis.
|
|
120
|
+
|
|
73
121
|
#### `ProgressEvent` shape
|
|
74
122
|
|
|
75
123
|
| `phase` | Extra fields | When fired |
|
|
@@ -77,6 +125,7 @@ console.log(stats.totals); // { TypeScript: 412000, … }
|
|
|
77
125
|
| `"discover"` | `details: string` | Once per year scanned |
|
|
78
126
|
| `"shas"` | `repo: string`, `count: number` | Once per repo after all SHAs collected |
|
|
79
127
|
| `"details"` | `fetched: number`, `total: number` | After every concurrency-batch of REST calls |
|
|
128
|
+
| `"pr-counts"` | `fetched: number`, `total: number` | After each repo's PR count is fetched |
|
|
80
129
|
| `"aggregate"` | — | Once, just before the final roll-up |
|
|
81
130
|
|
|
82
131
|
### Local development
|
|
@@ -114,6 +163,8 @@ Options:
|
|
|
114
163
|
--concurrency <n> Concurrent REST requests (default: 5)
|
|
115
164
|
--from-year <year> Earliest year to include (default: 10 years ago)
|
|
116
165
|
--exclude-langs <langs> Comma-separated languages to exclude (e.g. HCL,JSON)
|
|
166
|
+
--exclude-commit-dates Exclude commit dates from output (included by default)
|
|
167
|
+
--exclude-pr-counts Exclude PR counts from output (included by default)
|
|
117
168
|
--select-repos Interactively pick repos to analyse after commit counts are known
|
|
118
169
|
--stats-only Re-aggregate from cache without fetching new data
|
|
119
170
|
--reset Delete cache and start fresh
|
|
@@ -123,17 +174,19 @@ Options:
|
|
|
123
174
|
|
|
124
175
|
### `--select-repos` interactive picker
|
|
125
176
|
|
|
126
|
-
When passed, after
|
|
127
|
-
checkbox list sorted
|
|
177
|
+
When passed, after discovering repositories the tool shows a full-screen
|
|
178
|
+
checkbox list sorted alphabetically. All repos are pre-selected:
|
|
128
179
|
|
|
129
180
|
```
|
|
130
|
-
? Choose repos (42 total
|
|
131
|
-
❯◉ myorg/
|
|
132
|
-
◉ myorg/
|
|
133
|
-
◉ octocat/personal-site
|
|
181
|
+
? Choose repos (42 total)
|
|
182
|
+
❯◉ myorg/frontend
|
|
183
|
+
◉ myorg/monorepo
|
|
184
|
+
◉ octocat/personal-site
|
|
134
185
|
...
|
|
135
186
|
```
|
|
136
187
|
|
|
188
|
+
This happens **before** collecting commits, allowing you to filter repos early and save time.
|
|
189
|
+
|
|
137
190
|
| Key | Action |
|
|
138
191
|
|-----|--------|
|
|
139
192
|
| `space` | Toggle selected repo |
|
|
@@ -152,8 +205,13 @@ checkbox list sorted by **number of commits** (highest first). All repos are pre
|
|
|
152
205
|
},
|
|
153
206
|
"byRepo": {
|
|
154
207
|
"myorg/myrepo": {
|
|
155
|
-
"
|
|
156
|
-
|
|
208
|
+
"contributionsCountPerLanguage": {
|
|
209
|
+
"TypeScript": 200000,
|
|
210
|
+
"CSS": 5000
|
|
211
|
+
},
|
|
212
|
+
"commitDates": ["2025-11-15", "2025-11-16"],
|
|
213
|
+
"prCount": 42,
|
|
214
|
+
"isPrivate": false
|
|
157
215
|
}
|
|
158
216
|
},
|
|
159
217
|
"meta": {
|
|
@@ -166,14 +224,19 @@ checkbox list sorted by **number of commits** (highest first). All repos are pre
|
|
|
166
224
|
}
|
|
167
225
|
```
|
|
168
226
|
|
|
169
|
-
###
|
|
227
|
+
### Optional fields in `byRepo`
|
|
228
|
+
|
|
229
|
+
- **`commitDates`**: Array of ISO date strings (YYYY-MM-DD), included by default. Use `--exclude-commit-dates` to omit.
|
|
230
|
+
- **`prCount`**: Number of pull requests authored by the user in this repository, included by default. Use `--exclude-pr-counts` to omit.
|
|
231
|
+
- **`isPrivate`**: Boolean indicating if the repository is private (always included when available).
|
|
170
232
|
|
|
171
|
-
|
|
233
|
+
When `--exclude-pr-counts` is used, the metadata includes `"excludedPRs": true`.
|
|
172
234
|
|
|
173
235
|
## Tips
|
|
174
236
|
|
|
175
237
|
- **First run is slow** — at 5k req/hr with 30k commits it can take hours. Let it run overnight; it saves progress every 50 commits.
|
|
176
238
|
- **Subsequent runs are fast** — only new commits since the last run are fetched.
|
|
239
|
+
- **PR collection is rate-limited** — GitHub's Search API allows only 30 requests/minute (not 5000/hour like the REST API). For 100 repos, PR collection takes ~3-4 minutes. Use `--exclude-pr-counts` to skip if you don't need PR data.
|
|
177
240
|
- **Exclude infrastructure languages** with `--exclude-langs HCL,Dockerfile` if teammates committed those to repos you also touched.
|
|
178
241
|
- **Adjust concurrency** carefully — GitHub's [secondary rate limits](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api) may trigger at high concurrency even if your primary limit is not exhausted. `5` is a safe default.
|
|
179
242
|
|
package/dist/aggregator.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { AggregatedStats, CommitDetail } from "./types.js";
|
|
2
|
-
export declare function aggregate(user: string, commitsByRepo: Record<string, string[]>, commitDetails: Record<string, CommitDetail | null>, excludeLanguages?: string[], includeCommitDates?: boolean): AggregatedStats;
|
|
1
|
+
import type { AggregatedStats, CommitDetail, Repo } from "./types.js";
|
|
2
|
+
export declare function aggregate(user: string, commitsByRepo: Record<string, string[]>, commitDetails: Record<string, CommitDetail | null>, excludeLanguages?: string[], includeCommitDates?: boolean, prCountByRepo?: Record<string, number>, repos?: Repo[], includePRCounts?: boolean): AggregatedStats;
|
|
3
3
|
//# sourceMappingURL=aggregator.d.ts.map
|
package/dist/aggregator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAa,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,IAAI,EAAa,MAAM,YAAY,CAAC;AAGjF,wBAAgB,SAAS,CACxB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC,EAClD,gBAAgB,GAAE,MAAM,EAAO,EAC/B,kBAAkB,GAAE,OAAc,EAClC,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAC1C,KAAK,GAAE,IAAI,EAAO,EAClB,eAAe,GAAE,OAAc,GAC7B,eAAe,CA0GjB"}
|
package/dist/aggregator.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { detectLanguage, isExcludedLanguage } from "./language-detector.js";
|
|
2
2
|
// We accept the cache data object directly for aggregation
|
|
3
|
-
export function aggregate(user, commitsByRepo, commitDetails, excludeLanguages = [], includeCommitDates = true) {
|
|
3
|
+
export function aggregate(user, commitsByRepo, commitDetails, excludeLanguages = [], includeCommitDates = true, prCountByRepo = {}, repos = [], includePRCounts = true) {
|
|
4
4
|
const totals = {};
|
|
5
5
|
const byRepo = {};
|
|
6
6
|
let totalCommitsProcessed = 0;
|
|
7
|
+
// Build a repo map for quick lookup of isPrivate
|
|
8
|
+
const repoMap = new Map();
|
|
9
|
+
for (const repo of repos) {
|
|
10
|
+
repoMap.set(`${repo.owner}/${repo.name}`, repo);
|
|
11
|
+
}
|
|
7
12
|
for (const [repoKey, shas] of Object.entries(commitsByRepo)) {
|
|
8
13
|
const repoLangs = {};
|
|
9
14
|
const commitDates = [];
|
|
@@ -32,11 +37,26 @@ export function aggregate(user, commitsByRepo, commitDetails, excludeLanguages =
|
|
|
32
37
|
}
|
|
33
38
|
}
|
|
34
39
|
if (Object.keys(repoLangs).length > 0) {
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
const repoData = {
|
|
41
|
+
contributionsCountPerLanguage: repoLangs
|
|
42
|
+
};
|
|
43
|
+
// Add commit dates if enabled
|
|
37
44
|
if (includeCommitDates && commitDates.length > 0) {
|
|
38
|
-
|
|
45
|
+
repoData.commitDates = commitDates;
|
|
46
|
+
}
|
|
47
|
+
// Add PR count if enabled and available
|
|
48
|
+
if (includePRCounts) {
|
|
49
|
+
const prCount = prCountByRepo[repoKey];
|
|
50
|
+
if (prCount !== undefined) {
|
|
51
|
+
repoData.prCount = prCount;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Add isPrivate if available
|
|
55
|
+
const repo = repoMap.get(repoKey);
|
|
56
|
+
if (repo?.isPrivate !== undefined) {
|
|
57
|
+
repoData.isPrivate = repo.isPrivate;
|
|
39
58
|
}
|
|
59
|
+
byRepo[repoKey] = repoData;
|
|
40
60
|
}
|
|
41
61
|
}
|
|
42
62
|
// Sort totals descending
|
|
@@ -45,14 +65,19 @@ export function aggregate(user, commitsByRepo, commitDetails, excludeLanguages =
|
|
|
45
65
|
const sortedByRepo = Object.fromEntries(Object.entries(byRepo)
|
|
46
66
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
47
67
|
.map(([repo, data]) => {
|
|
48
|
-
// Extract commitDates if present
|
|
49
|
-
const { commitDates, ...langs } = data;
|
|
50
68
|
// Sort language entries
|
|
51
|
-
const sortedLangs = Object.fromEntries(Object.entries(
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
69
|
+
const sortedLangs = Object.fromEntries(Object.entries(data.contributionsCountPerLanguage).sort(([, a], [, b]) => b - a));
|
|
70
|
+
// Build result with sorted langs and all optional fields
|
|
71
|
+
const result = {
|
|
72
|
+
contributionsCountPerLanguage: sortedLangs
|
|
73
|
+
};
|
|
74
|
+
if (data.commitDates)
|
|
75
|
+
result.commitDates = data.commitDates;
|
|
76
|
+
if (data.prCount !== undefined)
|
|
77
|
+
result.prCount = data.prCount;
|
|
78
|
+
if (data.isPrivate !== undefined)
|
|
79
|
+
result.isPrivate = data.isPrivate;
|
|
80
|
+
return [repo, result];
|
|
56
81
|
}));
|
|
57
82
|
return {
|
|
58
83
|
totals: sortedTotals,
|
|
@@ -62,7 +87,8 @@ export function aggregate(user, commitsByRepo, commitDetails, excludeLanguages =
|
|
|
62
87
|
generatedAt: new Date().toISOString(),
|
|
63
88
|
totalCommitsProcessed,
|
|
64
89
|
totalRepos: Object.keys(byRepo).length,
|
|
65
|
-
unit: "lines_changed"
|
|
90
|
+
unit: "lines_changed",
|
|
91
|
+
...(includePRCounts ? {} : { excludedPRs: true })
|
|
66
92
|
}
|
|
67
93
|
};
|
|
68
94
|
}
|
package/dist/aggregator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5E,2DAA2D;AAC3D,MAAM,UAAU,SAAS,CACxB,IAAY,EACZ,aAAuC,EACvC,aAAkD,EAClD,mBAA6B,EAAE,EAC/B,qBAA8B,IAAI;
|
|
1
|
+
{"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
CHANGED
|
@@ -24,9 +24,14 @@ export declare class CacheStore {
|
|
|
24
24
|
getAggregationData(): {
|
|
25
25
|
commitsByRepo: Record<string, string[]>;
|
|
26
26
|
commitDetails: Record<string, CommitDetail | null>;
|
|
27
|
+
prCountByRepo: Record<string, number>;
|
|
27
28
|
};
|
|
28
29
|
/** Clear all cached data */
|
|
29
30
|
reset(): void;
|
|
31
|
+
isRepoPRComplete(owner: string, repo: string): boolean;
|
|
32
|
+
markRepoPRComplete(owner: string, repo: string): void;
|
|
33
|
+
getPRCount(owner: string, repo: string): number | undefined;
|
|
34
|
+
setPRCount(owner: string, repo: string, count: number): void;
|
|
30
35
|
}
|
|
31
36
|
export declare function defaultCachePath(user: string): string;
|
|
32
37
|
//# sourceMappingURL=cache.d.ts.map
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAS,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAS,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAgB5D,qBAAa,UAAU;IACtB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAQ;gBAER,SAAS,EAAE,MAAM;IAK7B,OAAO,CAAC,IAAI;IAkBZ,IAAI,IAAI,IAAI;IAMZ,IAAI,KAAK,IAAI,IAAI,EAAE,CAElB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAEtB;IAED,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAED,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpD,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOnD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAIjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAQ7D,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIrC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS;IAI7D,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI;IAI/D,qDAAqD;IACrD,kBAAkB,IAAI,MAAM;IAU5B,eAAe,IAAI,MAAM;IAQzB,8BAA8B;IAC9B,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,gEAAgE;IAChE,kBAAkB,IAAI;QACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC;QACnD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC;IAQD,4BAA4B;IAC5B,KAAK,IAAI,IAAI;IAMb,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAKtD,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQrD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAK5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
package/dist/cache.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
|
-
const CACHE_VERSION =
|
|
3
|
+
const CACHE_VERSION = 3;
|
|
4
4
|
function emptyCache() {
|
|
5
5
|
return {
|
|
6
6
|
version: CACHE_VERSION,
|
|
7
7
|
repos: [],
|
|
8
8
|
completedRepos: [],
|
|
9
9
|
commitsByRepo: {},
|
|
10
|
-
commitDetails: {}
|
|
10
|
+
commitDetails: {},
|
|
11
|
+
prCountByRepo: {},
|
|
12
|
+
completedPRRepos: []
|
|
11
13
|
};
|
|
12
14
|
}
|
|
13
15
|
export class CacheStore {
|
|
@@ -103,13 +105,37 @@ export class CacheStore {
|
|
|
103
105
|
getAggregationData() {
|
|
104
106
|
return {
|
|
105
107
|
commitsByRepo: this.data.commitsByRepo,
|
|
106
|
-
commitDetails: this.data.commitDetails
|
|
108
|
+
commitDetails: this.data.commitDetails,
|
|
109
|
+
prCountByRepo: this.data.prCountByRepo ?? {}
|
|
107
110
|
};
|
|
108
111
|
}
|
|
109
112
|
/** Clear all cached data */
|
|
110
113
|
reset() {
|
|
111
114
|
this.data = emptyCache();
|
|
112
115
|
}
|
|
116
|
+
// ─── PR Count Methods ─────────────────────────────────────────────────────
|
|
117
|
+
isRepoPRComplete(owner, repo) {
|
|
118
|
+
const key = `${owner}/${repo}`;
|
|
119
|
+
return (this.data.completedPRRepos ?? []).includes(key);
|
|
120
|
+
}
|
|
121
|
+
markRepoPRComplete(owner, repo) {
|
|
122
|
+
const key = `${owner}/${repo}`;
|
|
123
|
+
if (!this.data.completedPRRepos)
|
|
124
|
+
this.data.completedPRRepos = [];
|
|
125
|
+
if (!this.data.completedPRRepos.includes(key)) {
|
|
126
|
+
this.data.completedPRRepos.push(key);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
getPRCount(owner, repo) {
|
|
130
|
+
const key = `${owner}/${repo}`;
|
|
131
|
+
return this.data.prCountByRepo?.[key];
|
|
132
|
+
}
|
|
133
|
+
setPRCount(owner, repo, count) {
|
|
134
|
+
const key = `${owner}/${repo}`;
|
|
135
|
+
if (!this.data.prCountByRepo)
|
|
136
|
+
this.data.prCountByRepo = {};
|
|
137
|
+
this.data.prCountByRepo[key] = count;
|
|
138
|
+
}
|
|
113
139
|
}
|
|
114
140
|
export function defaultCachePath(user) {
|
|
115
141
|
return join(process.cwd(), ".github-lang-stats-cache", `${user}.json`);
|
package/dist/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,SAAS,UAAU;IAClB,OAAO;QACN,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,EAAE;QACT,cAAc,EAAE,EAAE;QAClB,aAAa,EAAE,EAAE;QACjB,aAAa,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/github-client.d.ts
CHANGED
|
@@ -21,5 +21,6 @@ export declare class GitHubClient {
|
|
|
21
21
|
getUserNodeId(username: string): Promise<string>;
|
|
22
22
|
collectCommitShas(owner: string, repo: string, authorId: string, onPage?: (count: number) => void, fromYear?: number): Promise<string[]>;
|
|
23
23
|
fetchCommitDetail(owner: string, repo: string, sha: string): Promise<CommitDetail | null>;
|
|
24
|
+
fetchPRCount(owner: string, repo: string, username: string): Promise<number>;
|
|
24
25
|
}
|
|
25
26
|
//# sourceMappingURL=github-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../src/github-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQpE,qBAAa,YAAY;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,cAAc,CAAK;gBAEf,KAAK,EAAE,MAAM;IAIzB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,0BAA0B;IASlC,4DAA4D;YAC9C,QAAQ;IAatB,gBAAgB,IAAI,aAAa;IAiB3B,OAAO,CAAC,CAAC,GAAG,OAAO,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,CAAC,CAAC;IA2BP,oBAAoB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../src/github-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQpE,qBAAa,YAAY;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,cAAc,CAAK;gBAEf,KAAK,EAAE,MAAM;IAIzB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,0BAA0B;IASlC,4DAA4D;YAC9C,QAAQ;IAatB,gBAAgB,IAAI,aAAa;IAiB3B,OAAO,CAAC,CAAC,GAAG,OAAO,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,CAAC,CAAC;IA2BP,oBAAoB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAqCvC,6BAA6B,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAO,EACf,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,IAAI,EAAE,CAAC;IAoEZ,wBAAwB,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAO,EACf,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,IAAI,EAAE,CAAC;IAsBZ,SAAS,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAWnD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYhD,iBAAiB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC;IAkEd,iBAAiB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACT,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA2DzB,YAAY,CACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;CA8BlB"}
|
package/dist/github-client.js
CHANGED
|
@@ -91,7 +91,7 @@ export class GitHubClient {
|
|
|
91
91
|
if (apiRepos.length === 0)
|
|
92
92
|
break;
|
|
93
93
|
for (const r of apiRepos) {
|
|
94
|
-
repos.push({ owner: r.owner.login, name: r.name });
|
|
94
|
+
repos.push({ owner: r.owner.login, name: r.name, isPrivate: r.private });
|
|
95
95
|
}
|
|
96
96
|
if (apiRepos.length < perPage)
|
|
97
97
|
break;
|
|
@@ -119,6 +119,7 @@ export class GitHubClient {
|
|
|
119
119
|
repository {
|
|
120
120
|
owner { login }
|
|
121
121
|
name
|
|
122
|
+
isPrivate
|
|
122
123
|
}
|
|
123
124
|
}
|
|
124
125
|
}
|
|
@@ -131,7 +132,8 @@ export class GitHubClient {
|
|
|
131
132
|
if (!repoMap.has(key)) {
|
|
132
133
|
repoMap.set(key, {
|
|
133
134
|
owner: entry.repository.owner.login,
|
|
134
|
-
name: entry.repository.name
|
|
135
|
+
name: entry.repository.name,
|
|
136
|
+
isPrivate: entry.repository.isPrivate
|
|
135
137
|
});
|
|
136
138
|
}
|
|
137
139
|
}
|
|
@@ -248,6 +250,41 @@ export class GitHubClient {
|
|
|
248
250
|
}))
|
|
249
251
|
};
|
|
250
252
|
}
|
|
253
|
+
// ---------------------------------------------------------------------------
|
|
254
|
+
// Fetch PR count for a repository (authored by user)
|
|
255
|
+
// Uses the search API for efficiency
|
|
256
|
+
//
|
|
257
|
+
// IMPORTANT: GitHub Search API has a separate rate limit of 30 requests/minute
|
|
258
|
+
// (not the standard 5000/hour REST API limit). Callers should add ~2s delays
|
|
259
|
+
// between requests to avoid hitting this limit.
|
|
260
|
+
//
|
|
261
|
+
// Note: We skip the standard throttle() check here because:
|
|
262
|
+
// - Search API has its own much lower limit (30/min vs 5000/hr)
|
|
263
|
+
// - The reserve of 100 would always trigger on Search API (30 < 100)
|
|
264
|
+
// - We have retry logic for 429/403 and callers add manual delays
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
async fetchPRCount(owner, repo, username) {
|
|
267
|
+
// Don't call this.throttle() - Search API has separate rate limit
|
|
268
|
+
// Search for PRs authored by user in this repo
|
|
269
|
+
const query = `author:${username} type:pr repo:${owner}/${repo}`;
|
|
270
|
+
const url = `${GH_REST}/search/issues?q=${encodeURIComponent(query)}&per_page=1`;
|
|
271
|
+
const res = await fetch(url, { headers: this.headers() });
|
|
272
|
+
this.updateRateLimitFromHeaders(res.headers);
|
|
273
|
+
if (res.status === 404 || res.status === 422)
|
|
274
|
+
return 0;
|
|
275
|
+
if (!res.ok) {
|
|
276
|
+
if (res.status === 429 || res.status === 403) {
|
|
277
|
+
// Secondary rate limit — wait and retry once
|
|
278
|
+
const retryAfter = parseInt(res.headers.get("retry-after") ?? "60", 10);
|
|
279
|
+
process.stderr.write(`\nSecondary rate limit hit. Waiting ${retryAfter}s...\n`);
|
|
280
|
+
await sleep(retryAfter * 1000);
|
|
281
|
+
return this.fetchPRCount(owner, repo, username);
|
|
282
|
+
}
|
|
283
|
+
throw new Error(`fetchPRCount failed (${res.status}) for ${owner}/${repo}`);
|
|
284
|
+
}
|
|
285
|
+
const json = (await res.json());
|
|
286
|
+
return json.total_count;
|
|
287
|
+
}
|
|
251
288
|
}
|
|
252
289
|
function sleep(ms) {
|
|
253
290
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../src/github-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../src/github-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -29,6 +29,7 @@ program
|
|
|
29
29
|
.option("--stats-only", "Skip fetching new data, just aggregate from existing cache")
|
|
30
30
|
.option("--reset", "Delete cache and start fresh")
|
|
31
31
|
.option("--exclude-commit-dates", "Exclude commit dates from output (dates are included by default for heatmap visualization)")
|
|
32
|
+
.option("--exclude-pr-counts", "Exclude PR counts from output (PR counts are included by default for activity metrics)")
|
|
32
33
|
.parse(process.argv);
|
|
33
34
|
const opts = program.opts();
|
|
34
35
|
const concurrency = parseInt(opts.concurrency, 10);
|
|
@@ -65,8 +66,12 @@ if (!opts.noCache)
|
|
|
65
66
|
console.log(chalk.gray(`Cache: ${cachePath}`));
|
|
66
67
|
console.log();
|
|
67
68
|
// ─── Phase 1: Discover repos ──────────────────────────────────────────────────
|
|
69
|
+
// Keep full repo list in cache, use separate variable for selected repos
|
|
70
|
+
let reposToAnalyse = cache.repos;
|
|
68
71
|
if (!opts.statsOnly) {
|
|
69
|
-
|
|
72
|
+
// Always refresh repos when using --select-repos to show newly created repos
|
|
73
|
+
const needsFreshRepos = cache.repos.length === 0 || opts.selectRepos;
|
|
74
|
+
if (needsFreshRepos) {
|
|
70
75
|
const spinner = ora("Discovering contributed repositories (year-by-year)…").start();
|
|
71
76
|
let currentYear = 0;
|
|
72
77
|
const repos = await client.discoverContributedRepos(user, fromYear, (year) => {
|
|
@@ -82,8 +87,39 @@ if (!opts.statsOnly) {
|
|
|
82
87
|
console.log(chalk.green(`✓`) +
|
|
83
88
|
` Using cached repo list: ${chalk.bold(cache.repos.length)} repos`);
|
|
84
89
|
}
|
|
90
|
+
// Update working repo list
|
|
91
|
+
reposToAnalyse = cache.repos;
|
|
92
|
+
// ─── Phase 1.5: Interactive repo selection ────────────────────────────────────
|
|
93
|
+
if (opts.selectRepos) {
|
|
94
|
+
const repoEntries = cache.repos
|
|
95
|
+
.map((r) => ({
|
|
96
|
+
repo: r,
|
|
97
|
+
key: `${r.owner}/${r.name}`
|
|
98
|
+
}))
|
|
99
|
+
.sort((a, b) => a.key.localeCompare(b.key));
|
|
100
|
+
console.log(`\n${chalk.bold("Select repositories to analyse")} ` +
|
|
101
|
+
chalk.gray("(space=toggle, a=toggle all, i=invert, enter=confirm)\n"));
|
|
102
|
+
const selected = await checkbox({
|
|
103
|
+
message: `Choose repos (${repoEntries.length} total)`,
|
|
104
|
+
choices: repoEntries.map(({ key }) => ({
|
|
105
|
+
name: key,
|
|
106
|
+
value: key,
|
|
107
|
+
checked: true
|
|
108
|
+
})),
|
|
109
|
+
pageSize: 20,
|
|
110
|
+
loop: false
|
|
111
|
+
});
|
|
112
|
+
if (selected.length === 0) {
|
|
113
|
+
console.log(chalk.red("No repositories selected — nothing to do."));
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
const selectedSet = new Set(selected);
|
|
117
|
+
reposToAnalyse = cache.repos.filter((r) => selectedSet.has(`${r.owner}/${r.name}`));
|
|
118
|
+
console.log(chalk.green(`✓`) +
|
|
119
|
+
` Analysing ${chalk.bold(reposToAnalyse.length)} selected repos\n`);
|
|
120
|
+
}
|
|
85
121
|
// ─── Phase 2: Collect commit SHAs per repo ──────────────────────────────────
|
|
86
|
-
const incompleteRepos =
|
|
122
|
+
const incompleteRepos = reposToAnalyse.filter((r) => !cache.isRepoComplete(r.owner, r.name));
|
|
87
123
|
if (incompleteRepos.length > 0) {
|
|
88
124
|
console.log(`\nCollecting commit SHAs for ${chalk.bold(incompleteRepos.length)} repos…`);
|
|
89
125
|
// Use the user's GitHub node ID for reliable author filtering
|
|
@@ -116,36 +152,6 @@ if (!opts.statsOnly) {
|
|
|
116
152
|
else {
|
|
117
153
|
console.log(`${chalk.green(`✓`)} All repo commit SHAs already cached`);
|
|
118
154
|
}
|
|
119
|
-
// ─── Phase 2.5: Interactive repo selection ────────────────────────────────────
|
|
120
|
-
if (opts.selectRepos) {
|
|
121
|
-
const repoEntries = cache.repos
|
|
122
|
-
.map((r) => ({
|
|
123
|
-
repo: r,
|
|
124
|
-
key: `${r.owner}/${r.name}`,
|
|
125
|
-
count: cache.getCommits(r.owner, r.name).length
|
|
126
|
-
}))
|
|
127
|
-
.sort((a, b) => b.count - a.count);
|
|
128
|
-
console.log(`\n${chalk.bold("Select repositories to analyse")} ` +
|
|
129
|
-
chalk.gray("(space=toggle, a=toggle all, i=invert, enter=confirm)\n"));
|
|
130
|
-
const selected = await checkbox({
|
|
131
|
-
message: `Choose repos (${repoEntries.length} total, sorted by commit count)`,
|
|
132
|
-
choices: repoEntries.map(({ key, count }) => ({
|
|
133
|
-
name: `${key.padEnd(55)} ${chalk.gray(`${String(count).padStart(5)} commits`)}`,
|
|
134
|
-
value: key,
|
|
135
|
-
checked: true
|
|
136
|
-
})),
|
|
137
|
-
pageSize: 20,
|
|
138
|
-
loop: false
|
|
139
|
-
});
|
|
140
|
-
if (selected.length === 0) {
|
|
141
|
-
console.log(chalk.red("No repositories selected — nothing to do."));
|
|
142
|
-
process.exit(0);
|
|
143
|
-
}
|
|
144
|
-
const selectedSet = new Set(selected);
|
|
145
|
-
cache.repos = cache.repos.filter((r) => selectedSet.has(`${r.owner}/${r.name}`));
|
|
146
|
-
console.log(chalk.green(`✓`) +
|
|
147
|
-
` Analysing ${chalk.bold(cache.repos.length)} selected repos\n`);
|
|
148
|
-
}
|
|
149
155
|
// ─── Phase 3: Fetch commit file details (REST) ──────────────────────────────
|
|
150
156
|
const pending = cache.pendingCommitCount();
|
|
151
157
|
const total = cache.totalCommitShas();
|
|
@@ -160,7 +166,7 @@ if (!opts.statsOnly) {
|
|
|
160
166
|
` Estimated time at ${usablePerHour} req/hr with concurrency=${concurrency}: ` +
|
|
161
167
|
`~${formatMinutes(pending / (usablePerHour / 60 / 60) / concurrency)}`));
|
|
162
168
|
const workList = [];
|
|
163
|
-
for (const repo of
|
|
169
|
+
for (const repo of reposToAnalyse) {
|
|
164
170
|
const shas = cache.getCommits(repo.owner, repo.name);
|
|
165
171
|
for (const sha of shas) {
|
|
166
172
|
if (!cache.hasCommitDetail(sha)) {
|
|
@@ -211,11 +217,55 @@ if (!opts.statsOnly) {
|
|
|
211
217
|
else {
|
|
212
218
|
console.log(`${chalk.green(`✓`)} All commit details already cached (${total} commits)`);
|
|
213
219
|
}
|
|
220
|
+
// ─── Phase 3.5: Collect PR counts ────────────────────────────────────────────
|
|
221
|
+
if (!opts.excludePrCounts) {
|
|
222
|
+
const incompletePRRepos = reposToAnalyse.filter((r) => !cache.isRepoPRComplete(r.owner, r.name));
|
|
223
|
+
if (incompletePRRepos.length > 0) {
|
|
224
|
+
const totalPRRepos = reposToAnalyse.length;
|
|
225
|
+
const alreadyDone = totalPRRepos - incompletePRRepos.length;
|
|
226
|
+
console.log(`\nCollecting PR counts: ${chalk.bold(incompletePRRepos.length)} remaining` +
|
|
227
|
+
(alreadyDone > 0 ? chalk.gray(` (${alreadyDone} already cached)`) : "") +
|
|
228
|
+
chalk.gray(`\n Note: Search API limited to 30 req/min, this will take ~${Math.ceil(incompletePRRepos.length / 30)} min`));
|
|
229
|
+
let prRepoIdx = 0;
|
|
230
|
+
let totalPRCount = 0;
|
|
231
|
+
const prBar = ora(`Collecting PR counts 0 / ${incompletePRRepos.length}…`).start();
|
|
232
|
+
for (const repo of incompletePRRepos) {
|
|
233
|
+
prRepoIdx++;
|
|
234
|
+
try {
|
|
235
|
+
const prCount = await client.fetchPRCount(repo.owner, repo.name, user);
|
|
236
|
+
cache.setPRCount(repo.owner, repo.name, prCount);
|
|
237
|
+
cache.markRepoPRComplete(repo.owner, repo.name);
|
|
238
|
+
totalPRCount += prCount;
|
|
239
|
+
if (!opts.noCache && prRepoIdx % 10 === 0) {
|
|
240
|
+
cache.save();
|
|
241
|
+
}
|
|
242
|
+
const pct = Math.round((prRepoIdx / incompletePRRepos.length) * 100);
|
|
243
|
+
prBar.text = `Collecting PR counts ${prRepoIdx} / ${incompletePRRepos.length} (${pct}%)`;
|
|
244
|
+
// Add delay to respect Search API rate limit (30 req/min = 2s between requests)
|
|
245
|
+
if (prRepoIdx < incompletePRRepos.length) {
|
|
246
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
process.stderr.write(`\n Warning: failed to fetch PR count for ${repo.owner}/${repo.name}: ${String(err)}\n`);
|
|
251
|
+
// Mark as complete even on error to avoid retrying indefinitely
|
|
252
|
+
cache.markRepoPRComplete(repo.owner, repo.name);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (!opts.noCache)
|
|
256
|
+
cache.save();
|
|
257
|
+
prBar.succeed(`Collected PR counts for ${chalk.bold(incompletePRRepos.length)} repos (${totalPRCount} PRs total)`);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.log(`${chalk.green(`✓`)} All PR counts already cached`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
214
263
|
}
|
|
215
264
|
// ─── Phase 4: Aggregate ───────────────────────────────────────────────────────
|
|
216
265
|
console.log(chalk.gray("\nAggregating…"));
|
|
217
|
-
const { commitsByRepo, commitDetails } = cache.getAggregationData();
|
|
218
|
-
const stats = aggregate(user, commitsByRepo, commitDetails, excludeLanguages, !opts.excludeCommitDates // Include by default, exclude if flag is set
|
|
266
|
+
const { commitsByRepo, commitDetails, prCountByRepo } = cache.getAggregationData();
|
|
267
|
+
const stats = aggregate(user, commitsByRepo, commitDetails, excludeLanguages, !opts.excludeCommitDates, // Include by default, exclude if flag is set
|
|
268
|
+
prCountByRepo, reposToAnalyse, !opts.excludePrCounts // Include by default, exclude if flag is set
|
|
219
269
|
);
|
|
220
270
|
const json = JSON.stringify(stats, null, 2);
|
|
221
271
|
if (opts.output) {
|
|
@@ -237,7 +287,17 @@ for (const [lang, lines] of topN) {
|
|
|
237
287
|
const bar = "█".repeat(Math.round((lines / maxLines) * 20));
|
|
238
288
|
console.log(` ${lang.padEnd(20)} ${bar.padEnd(20)} ${formatNum(lines)}`);
|
|
239
289
|
}
|
|
240
|
-
|
|
290
|
+
// Calculate total PRs if included
|
|
291
|
+
let summaryText = `\nProcessed ${stats.meta.totalCommitsProcessed} commits`;
|
|
292
|
+
if (!opts.excludePrCounts) {
|
|
293
|
+
const totalPRs = Object.values(prCountByRepo).reduce((sum, count) => sum + count, 0);
|
|
294
|
+
summaryText += `, ${totalPRs} PRs`;
|
|
295
|
+
}
|
|
296
|
+
summaryText += ` across ${stats.meta.totalRepos} repos`;
|
|
297
|
+
if (opts.excludePrCounts) {
|
|
298
|
+
summaryText += ` (PR collection skipped)`;
|
|
299
|
+
}
|
|
300
|
+
console.log(chalk.gray(summaryText));
|
|
241
301
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
242
302
|
function formatMinutes(minutes) {
|
|
243
303
|
if (minutes < 1)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { AggregatedStats } from "./types.js";
|
|
1
|
+
import type { AggregatedStats, Repo } from "./types.js";
|
|
2
2
|
export type { AggregatedStats, CommitDetail, CommitFileDetail, RateLimitInfo, Repo, RepoStats } from "./types.js";
|
|
3
|
+
export { GitHubClient } from "./github-client.js";
|
|
3
4
|
export interface GetGithubLangStatsOptions {
|
|
4
5
|
/**
|
|
5
6
|
* GitHub username to analyse.
|
|
@@ -40,6 +41,12 @@ export interface GetGithubLangStatsOptions {
|
|
|
40
41
|
* Defaults to `true`.
|
|
41
42
|
*/
|
|
42
43
|
includeCommitDates?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Include PR counts for activity metrics.
|
|
46
|
+
* Adds a `prCount` field to each repo with the number of PRs authored by the user.
|
|
47
|
+
* Defaults to `true`.
|
|
48
|
+
*/
|
|
49
|
+
includePRCounts?: boolean;
|
|
43
50
|
/** Optional progress callback invoked as each phase advances. */
|
|
44
51
|
onProgress?: (event: ProgressEvent) => void;
|
|
45
52
|
}
|
|
@@ -54,9 +61,50 @@ export type ProgressEvent = {
|
|
|
54
61
|
phase: "details";
|
|
55
62
|
fetched: number;
|
|
56
63
|
total: number;
|
|
64
|
+
} | {
|
|
65
|
+
phase: "pr-counts";
|
|
66
|
+
fetched: number;
|
|
67
|
+
total: number;
|
|
57
68
|
} | {
|
|
58
69
|
phase: "aggregate";
|
|
59
70
|
};
|
|
71
|
+
export interface ListRepositoriesOptions {
|
|
72
|
+
/**
|
|
73
|
+
* GitHub username to discover repos for.
|
|
74
|
+
* When omitted, the username is resolved automatically from the token.
|
|
75
|
+
*/
|
|
76
|
+
user?: string;
|
|
77
|
+
/** GitHub Personal Access Token (needs repo + read:user scopes) */
|
|
78
|
+
token: string;
|
|
79
|
+
/**
|
|
80
|
+
* Earliest year to scan for contributions.
|
|
81
|
+
* Defaults to **10 years ago** from the current year.
|
|
82
|
+
*/
|
|
83
|
+
fromYear?: number;
|
|
84
|
+
/** Optional progress callback invoked as each year is scanned. */
|
|
85
|
+
onProgress?: (year: number) => void;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* List all repositories the user has contributed to.
|
|
89
|
+
*
|
|
90
|
+
* This combines two discovery methods:
|
|
91
|
+
* 1. REST API: All repos the user owns, collaborates on, or is an org member of
|
|
92
|
+
* 2. GraphQL: Public repos contributed to via PRs (year-by-year scan)
|
|
93
|
+
*
|
|
94
|
+
* @returns Array of repositories with owner, name, and privacy status
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```ts
|
|
98
|
+
* import { listRepositories } from "github-lang-stats";
|
|
99
|
+
*
|
|
100
|
+
* const repos = await listRepositories({
|
|
101
|
+
* token: process.env.GITHUB_TOKEN!,
|
|
102
|
+
* fromYear: 2020,
|
|
103
|
+
* });
|
|
104
|
+
* console.log(repos); // [{ owner: "octocat", name: "hello-world", isPrivate: false }, ...]
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
export declare function listRepositories(options: ListRepositoriesOptions): Promise<Repo[]>;
|
|
60
108
|
/**
|
|
61
109
|
* Fetch GitHub language statistics for the given user programmatically.
|
|
62
110
|
*
|
package/dist/lib.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAExD,YAAY,EACX,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,IAAI,EACJ,SAAS,EACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACzC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iEAAiE;IACjE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,MAAM,aAAa,GACtB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B,MAAM,WAAW,uBAAuB;IACvC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,uBAAuB,GAC9B,OAAO,CAAC,IAAI,EAAE,CAAC,CAoBjB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,yBAAyB,GAChC,OAAO,CAAC,eAAe,CAAC,CA0K1B"}
|
package/dist/lib.js
CHANGED
|
@@ -16,6 +16,41 @@
|
|
|
16
16
|
import { aggregate } from "./aggregator.js";
|
|
17
17
|
import { CacheStore, defaultCachePath } from "./cache.js";
|
|
18
18
|
import { GitHubClient } from "./github-client.js";
|
|
19
|
+
export { GitHubClient } from "./github-client.js";
|
|
20
|
+
/**
|
|
21
|
+
* List all repositories the user has contributed to.
|
|
22
|
+
*
|
|
23
|
+
* This combines two discovery methods:
|
|
24
|
+
* 1. REST API: All repos the user owns, collaborates on, or is an org member of
|
|
25
|
+
* 2. GraphQL: Public repos contributed to via PRs (year-by-year scan)
|
|
26
|
+
*
|
|
27
|
+
* @returns Array of repositories with owner, name, and privacy status
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { listRepositories } from "github-lang-stats";
|
|
32
|
+
*
|
|
33
|
+
* const repos = await listRepositories({
|
|
34
|
+
* token: process.env.GITHUB_TOKEN!,
|
|
35
|
+
* fromYear: 2020,
|
|
36
|
+
* });
|
|
37
|
+
* console.log(repos); // [{ owner: "octocat", name: "hello-world", isPrivate: false }, ...]
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export async function listRepositories(options) {
|
|
41
|
+
const { user: userOption, token, fromYear = new Date().getFullYear() - 10, onProgress } = options;
|
|
42
|
+
const client = new GitHubClient(token);
|
|
43
|
+
// Resolve username from the token if not provided
|
|
44
|
+
let user;
|
|
45
|
+
if (userOption) {
|
|
46
|
+
user = userOption;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const viewer = await client.getViewer();
|
|
50
|
+
user = viewer.login;
|
|
51
|
+
}
|
|
52
|
+
return client.discoverContributedRepos(user, fromYear, onProgress);
|
|
53
|
+
}
|
|
19
54
|
/**
|
|
20
55
|
* Fetch GitHub language statistics for the given user programmatically.
|
|
21
56
|
*
|
|
@@ -24,7 +59,7 @@ import { GitHubClient } from "./github-client.js";
|
|
|
24
59
|
* or interactive prompts, making it suitable for embedding in other tools.
|
|
25
60
|
*/
|
|
26
61
|
export async function getGithubLangStats(options) {
|
|
27
|
-
const { user: userOption, token, fromYear = new Date().getFullYear() - 10, excludeLanguages = [], concurrency = 5, cachePath, useCache = true, repos: repoFilter, includeCommitDates = true, onProgress } = options;
|
|
62
|
+
const { user: userOption, token, fromYear = new Date().getFullYear() - 10, excludeLanguages = [], concurrency = 5, cachePath, useCache = true, repos: repoFilter, includeCommitDates = true, includePRCounts = true, onProgress } = options;
|
|
28
63
|
const client = new GitHubClient(token);
|
|
29
64
|
// Resolve username (and node ID) from the token if user was not provided
|
|
30
65
|
let user;
|
|
@@ -96,6 +131,36 @@ export async function getGithubLangStats(options) {
|
|
|
96
131
|
cache.save();
|
|
97
132
|
onProgress?.({ phase: "details", fetched, total: workList.length });
|
|
98
133
|
}
|
|
134
|
+
// ── Phase 3.5: Collect PR counts ────────────────────────────────────────
|
|
135
|
+
if (includePRCounts) {
|
|
136
|
+
const incompletePRRepos = reposToProcess.filter((r) => !cache.isRepoPRComplete(r.owner, r.name));
|
|
137
|
+
if (incompletePRRepos.length > 0) {
|
|
138
|
+
let prFetched = 0;
|
|
139
|
+
for (const repo of incompletePRRepos) {
|
|
140
|
+
try {
|
|
141
|
+
const prCount = await client.fetchPRCount(repo.owner, repo.name, user);
|
|
142
|
+
cache.setPRCount(repo.owner, repo.name, prCount);
|
|
143
|
+
cache.markRepoPRComplete(repo.owner, repo.name);
|
|
144
|
+
prFetched++;
|
|
145
|
+
if (useCache)
|
|
146
|
+
cache.save();
|
|
147
|
+
onProgress?.({
|
|
148
|
+
phase: "pr-counts",
|
|
149
|
+
fetched: prFetched,
|
|
150
|
+
total: incompletePRRepos.length
|
|
151
|
+
});
|
|
152
|
+
// Add delay to respect Search API rate limit (30 req/min = 2s between requests)
|
|
153
|
+
if (prFetched < incompletePRRepos.length) {
|
|
154
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (_err) {
|
|
158
|
+
// Mark as complete even on error to avoid retrying indefinitely
|
|
159
|
+
cache.markRepoPRComplete(repo.owner, repo.name);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
99
164
|
// ── Phase 4: Aggregate ──────────────────────────────────────────────────
|
|
100
165
|
onProgress?.({ phase: "aggregate" });
|
|
101
166
|
const filteredCommitsByRepo = {};
|
|
@@ -103,7 +168,7 @@ export async function getGithubLangStats(options) {
|
|
|
103
168
|
const key = `${repo.owner}/${repo.name}`;
|
|
104
169
|
filteredCommitsByRepo[key] = cache.getCommits(repo.owner, repo.name);
|
|
105
170
|
}
|
|
106
|
-
const { commitDetails } = cache.getAggregationData();
|
|
107
|
-
return aggregate(user, filteredCommitsByRepo, commitDetails, excludeLanguages, includeCommitDates);
|
|
171
|
+
const { commitDetails, prCountByRepo } = cache.getAggregationData();
|
|
172
|
+
return aggregate(user, filteredCommitsByRepo, commitDetails, excludeLanguages, includeCommitDates, prCountByRepo, reposToProcess, includePRCounts);
|
|
108
173
|
}
|
|
109
174
|
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAYlD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA4ElD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAAgC;IAEhC,MAAM,EACL,IAAI,EAAE,UAAU,EAChB,KAAK,EACL,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,EACxC,UAAU,EACV,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IAEvC,kDAAkD;IAClD,IAAI,IAAY,CAAC;IACjB,IAAI,UAAU,EAAE,CAAC;QAChB,IAAI,GAAG,UAAU,CAAC;IACnB,CAAC;SAAM,CAAC;QACP,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,OAAkC;IAElC,MAAM,EACL,IAAI,EAAE,UAAU,EAChB,KAAK,EACL,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,EACxC,gBAAgB,GAAG,EAAE,EACrB,WAAW,GAAG,CAAC,EACf,SAAS,EACT,QAAQ,GAAG,IAAI,EACf,KAAK,EAAE,UAAU,EACjB,kBAAkB,GAAG,IAAI,EACzB,eAAe,GAAG,IAAI,EACtB,UAAU,EACV,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IAEvC,yEAAyE;IACzE,IAAI,IAAY,CAAC;IACjB,IAAI,cAAkC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QAChB,IAAI,GAAG,UAAU,CAAC;IACnB,CAAC;SAAM,CAAC;QACP,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;QACpB,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAEpC,2EAA2E;IAE3E,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,wBAAwB,CACrD,IAAI,EACJ,QAAQ,EACR,CAAC,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,CAAC;gBACZ,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,8BAA8B,IAAI,GAAG;aAC9C,CAAC,CAAC;QACJ,CAAC,CACD,CAAC;QACF,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC;QACvB,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,cAAc,GAAG,UAAU;QAChC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IAEf,2EAA2E;IAE3E,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAC7C,CAAC;IAEF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,cAAc,IAAI,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpE,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAC1C,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,EACT,QAAQ,EACR,CAAC,KAAK,EAAE,EAAE;gBACT,UAAU,EAAE,CAAC;oBACZ,KAAK,EAAE,MAAM;oBACb,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;oBAClC,KAAK;iBACL,CAAC,CAAC;YACJ,CAAC,EACD,QAAQ,CACR,CAAC;YACF,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9C,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,QAAQ;gBAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;IACF,CAAC;IAKD,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5D,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACvC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAClC,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAC1C,CACD,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,KAAK,CAAC,eAAe,CACpB,GAAG,EACH,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACnD,CAAC;YACF,OAAO,EAAE,CAAC;QACX,CAAC;QACD,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,2EAA2E;IAE3E,IAAI,eAAe,EAAE,CAAC;QACrB,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAC/C,CAAC;QAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACJ,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACvE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACjD,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,SAAS,EAAE,CAAC;oBACZ,IAAI,QAAQ;wBAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC3B,UAAU,EAAE,CAAC;wBACZ,KAAK,EAAE,WAAW;wBAClB,OAAO,EAAE,SAAS;wBAClB,KAAK,EAAE,iBAAiB,CAAC,MAAM;qBAC/B,CAAC,CAAC;oBACH,gFAAgF;oBAChF,IAAI,SAAS,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC;wBAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC7C,CAAC;gBACF,CAAC;gBAAC,OAAO,IAAI,EAAE,CAAC;oBACf,gEAAgE;oBAChE,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjD,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,2EAA2E;IAE3E,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAErC,MAAM,qBAAqB,GAA6B,EAAE,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACzC,qBAAqB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAC;IAEpE,OAAO,SAAS,CACf,IAAI,EACJ,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,eAAe,CACf,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export interface Repo {
|
|
2
2
|
owner: string;
|
|
3
3
|
name: string;
|
|
4
|
+
isPrivate?: boolean;
|
|
4
5
|
}
|
|
5
6
|
export interface CommitSha {
|
|
6
7
|
owner: string;
|
|
@@ -23,10 +24,15 @@ export interface RepoLanguageStats {
|
|
|
23
24
|
repo: string;
|
|
24
25
|
languages: Record<string, number>;
|
|
25
26
|
}
|
|
26
|
-
export
|
|
27
|
+
export interface RepoStats {
|
|
27
28
|
/** Optional array of commit dates in ISO format (YYYY-MM-DD) */
|
|
28
29
|
commitDates?: string[];
|
|
29
|
-
|
|
30
|
+
contributionsCountPerLanguage: Record<string, number>;
|
|
31
|
+
/** PR count for this repository, included by default unless --exclude-pr-counts */
|
|
32
|
+
prCount?: number;
|
|
33
|
+
/** Repository privacy status */
|
|
34
|
+
isPrivate?: boolean;
|
|
35
|
+
}
|
|
30
36
|
export interface AggregatedStats {
|
|
31
37
|
/** Total lines changed (additions + deletions) per language across all repos */
|
|
32
38
|
totals: Record<string, number>;
|
|
@@ -39,6 +45,8 @@ export interface AggregatedStats {
|
|
|
39
45
|
totalCommitsProcessed: number;
|
|
40
46
|
totalRepos: number;
|
|
41
47
|
unit: "lines_changed";
|
|
48
|
+
/** Whether PR data was excluded (false or undefined means PRs were included) */
|
|
49
|
+
excludedPRs?: boolean;
|
|
42
50
|
};
|
|
43
51
|
}
|
|
44
52
|
export interface Cache {
|
|
@@ -50,6 +58,10 @@ export interface Cache {
|
|
|
50
58
|
commitsByRepo: Record<string, string[]>;
|
|
51
59
|
/** Map of "<sha>" → CommitDetail (or null if 404/error) */
|
|
52
60
|
commitDetails: Record<string, CommitDetail | null>;
|
|
61
|
+
/** Map of "owner/repo" → PR count */
|
|
62
|
+
prCountByRepo?: Record<string, number>;
|
|
63
|
+
/** Repos whose PR counts have been fully collected */
|
|
64
|
+
completedPRRepos?: string[];
|
|
53
65
|
}
|
|
54
66
|
export interface RateLimitInfo {
|
|
55
67
|
/** Total requests allowed per hour (from x-ratelimit-limit header) */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACzB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,yGAAyG;IACzG,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,eAAe;IACf,IAAI,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,eAAe,CAAC;QACtB,gFAAgF;QAChF,WAAW,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;CACF;AAED,MAAM,WAAW,KAAK;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,wDAAwD;IACxD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC;IACnD,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC7B,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;CACd"}
|