Skip to content

Commit 6acda08

Browse files
committed
Fetch dates for each tag, if GitHub releases aren't used
1 parent e5f4818 commit 6acda08

3 files changed

Lines changed: 37 additions & 11 deletions

File tree

src/lib/fetchers/github.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,24 @@ async function fetchTags(
7171

7272
const regex = new RegExp(tagPattern);
7373
const filtered = data.filter((t: Record<string, unknown>) => regex.test(String(t.name)));
74-
75-
return filtered.slice(0, 15).map((t: Record<string, unknown>) => ({
74+
const tags = filtered.slice(0, 15);
75+
76+
const dates = await Promise.all(
77+
tags.map(async (t: Record<string, unknown>) => {
78+
const sha = (t.commit as Record<string, unknown>)?.sha;
79+
if (!sha) return '';
80+
const commitUrl = `https://api.github.com/repos/${repo}/git/commits/${sha}`;
81+
const commitRes = await fetch(commitUrl, { headers: headers() });
82+
if (!commitRes.ok) return '';
83+
const commit = await commitRes.json();
84+
const dateStr = commit.committer?.date ?? commit.author?.date ?? '';
85+
return String(dateStr).split('T')[0];
86+
})
87+
);
88+
89+
return tags.map((t: Record<string, unknown>, i: number) => ({
7690
version: cleanVersion(String(t.name), tagReplace),
77-
date: '',
91+
date: dates[i],
7892
prerelease: false,
7993
lts: false,
8094
url: `https://github.com/${repo}/releases/tag/${t.name}`

tests/fixtures/github-tags.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
[
2-
{"name": "REL_16_2"},
3-
{"name": "REL_16_1"},
4-
{"name": "REL_15_6"},
5-
{"name": "REL_15_5"},
6-
{"name": "some-other-tag"},
7-
{"name": "REL_14_11"}
2+
{"name": "REL_16_2", "commit": {"sha": "aaa111"}},
3+
{"name": "REL_16_1", "commit": {"sha": "bbb222"}},
4+
{"name": "REL_15_6", "commit": {"sha": "ccc333"}},
5+
{"name": "REL_15_5", "commit": {"sha": "ddd444"}},
6+
{"name": "some-other-tag", "commit": {"sha": "eee555"}},
7+
{"name": "REL_14_11", "commit": {"sha": "fff666"}}
88
]

tests/unit/fetchers/github.test.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,20 @@ describe('fetchGitHub', () => {
102102
});
103103

104104
it('falls back to tags API when releases API returns no matches', async () => {
105-
// Releases API returns empty after filtering
105+
const commitDate = (date: string) =>
106+
new Response(JSON.stringify({ committer: { date: `${date}T12:00:00Z` } }), {
107+
status: 200
108+
});
109+
110+
// Releases API returns empty after filtering, then tags API, then per-tag commits
106111
vi.spyOn(globalThis, 'fetch')
107112
.mockResolvedValueOnce(new Response(JSON.stringify([]), { status: 200 }))
108-
.mockResolvedValueOnce(new Response(JSON.stringify(tagsFixture), { status: 200 }));
113+
.mockResolvedValueOnce(new Response(JSON.stringify(tagsFixture), { status: 200 }))
114+
.mockResolvedValueOnce(commitDate('2026-03-10'))
115+
.mockResolvedValueOnce(commitDate('2026-03-05'))
116+
.mockResolvedValueOnce(commitDate('2026-02-20'))
117+
.mockResolvedValueOnce(commitDate('2026-02-10'))
118+
.mockResolvedValueOnce(commitDate('2026-01-15'));
109119

110120
const config: PackageConfig = {
111121
...baseConfig,
@@ -116,7 +126,9 @@ describe('fetchGitHub', () => {
116126

117127
expect(result.releases).toHaveLength(5);
118128
expect(result.latest?.version).toBe('16.2');
129+
expect(result.latest?.date).toBe('2026-03-10');
119130
expect(result.releases[2].version).toBe('15.6');
131+
expect(result.releases[2].date).toBe('2026-02-20');
120132
});
121133

122134
it('filters monorepo releases by tagPattern (e.g. Astro)', async () => {

0 commit comments

Comments
 (0)