|
8 | 8 | import { |
9 | 9 | GithubReleaseCollectionSchama, |
10 | 10 | ForgejoReleaseCollectionSchema, |
| 11 | + GitlabReleaseCollectionSchema, |
11 | 12 | } from '~~/shared/schemas/changelog/release' |
12 | 13 | import { parse } from 'valibot' |
13 | 14 | import { changelogRenderer } from '~~/server/utils/changelog/markdown' |
@@ -36,6 +37,8 @@ export default defineCachedEventHandler( |
36 | 37 | case 'codeberg': |
37 | 38 | case 'forgejo': |
38 | 39 | return await getReleasesFromForgejo(owner, repo, host ?? 'codeberg.org') |
| 40 | + case 'gitlab': |
| 41 | + return await getReleasesFromGitlab(owner, repo, host ?? 'gitlab.com') |
39 | 42 |
|
40 | 43 | default: |
41 | 44 | throw createError({ |
@@ -111,3 +114,29 @@ async function getReleasesFromForgejo(owner: string, repo: string, host: string) |
111 | 114 | } satisfies ReleaseData |
112 | 115 | }) |
113 | 116 | } |
| 117 | + |
| 118 | +async function getReleasesFromGitlab(owner: string, repo: string, host: string) { |
| 119 | + owner = decodeURIComponent(owner) |
| 120 | + repo = decodeURIComponent(repo) |
| 121 | + |
| 122 | + const repoPath = encodeURIComponent(`${owner}/${repo}`) |
| 123 | + |
| 124 | + const data = await $fetch(`https://${host}/api/v4/projects/${repoPath}/releases`) |
| 125 | + |
| 126 | + const releases = parse(GitlabReleaseCollectionSchema, data) |
| 127 | + |
| 128 | + const render = await changelogRenderer(createGitLabRepoInfo(host, owner, repo)) |
| 129 | + |
| 130 | + return releases.map(r => { |
| 131 | + const { html, toc } = render(r.description, r.commit.short_id) |
| 132 | + return { |
| 133 | + id: r.commit.short_id, |
| 134 | + html: html?.replace(/(?<!>)\n/g, '<br>') ?? null, |
| 135 | + title: r.name || r.tag_name, |
| 136 | + prerelease: r.upcoming_release, |
| 137 | + toc, |
| 138 | + publishedAt: r.released_at, |
| 139 | + link: r._links.self, |
| 140 | + } satisfies ReleaseData |
| 141 | + }) |
| 142 | +} |
0 commit comments