Skip to content

Commit 67e2144

Browse files
committed
added support gitlab
1 parent f02e5ad commit 67e2144

5 files changed

Lines changed: 55 additions & 4 deletions

File tree

server/api/changelog/info/[name]/v/[version].get.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const defaultChangelogCacheOptions: Parameters<typeof defineCachedEventHa
1919
swr: true,
2020
getKey: event => {
2121
const { rawPackageName = '', rawVersion = 'latest' } = getChangelogRouteParams(event)
22-
return `changelogInfo:v1:${rawPackageName.trim().replaceAll('/', ':')}:${rawVersion.trim()}`
22+
return `changelogInfo:v2:${rawPackageName.trim().replaceAll('/', ':')}:${rawVersion.trim()}`
2323
},
2424
shouldBypassCache: () => import.meta.dev,
2525
}

server/api/changelog/md/[provider]/[owner]/[repo]/[...path].get.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export default defineCachedEventHandler(
2929
case 'codeberg':
3030
case 'forgejo':
3131
return await getForgejoMarkdown(owner, repo, path, host ?? 'codeberg.org')
32+
case 'gitlab':
33+
return await getGitlabMarkdown(owner, repo, path, host ?? 'gitlab.com')
3234

3335
default:
3436
throw createError({
@@ -72,3 +74,15 @@ async function getForgejoMarkdown(owner: string, repo: string, path: string, hos
7274

7375
return (await changelogRenderer(createForgejoRepoInfo(host, owner, repo, path)))(markdown)
7476
}
77+
78+
async function getGitlabMarkdown(owner: string, repo: string, path: string, host: string) {
79+
const data = await $fetch(
80+
`https://${host}/${decodeURIComponent(owner)}/${repo}/-/raw/HEAD/${path}`,
81+
)
82+
83+
const markdown = v.parse(v.string(), data)
84+
85+
return (
86+
await changelogRenderer(createGitLabRepoInfo(host, decodeURIComponent(owner), repo, path))
87+
)(markdown)
88+
}

server/api/changelog/releases/[provider]/[owner]/[repo].get.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import {
99
GithubReleaseCollectionSchama,
1010
ForgejoReleaseCollectionSchema,
11+
GitlabReleaseCollectionSchema,
1112
} from '~~/shared/schemas/changelog/release'
1213
import { parse } from 'valibot'
1314
import { changelogRenderer } from '~~/server/utils/changelog/markdown'
@@ -36,6 +37,8 @@ export default defineCachedEventHandler(
3637
case 'codeberg':
3738
case 'forgejo':
3839
return await getReleasesFromForgejo(owner, repo, host ?? 'codeberg.org')
40+
case 'gitlab':
41+
return await getReleasesFromGitlab(owner, repo, host ?? 'gitlab.com')
3942

4043
default:
4144
throw createError({
@@ -111,3 +114,29 @@ async function getReleasesFromForgejo(owner: string, repo: string, host: string)
111114
} satisfies ReleaseData
112115
})
113116
}
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+
}

server/utils/changelog/detectChangelog.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ async function checkFiles(ref: RepoRef, baseUrl: RepoFileUrl, dir?: string) {
189189
type: 'md',
190190
provider: ref.provider,
191191
path: resolveURL(dir ?? '', fileName),
192-
repo: `${encodeURIComponent(ref.owner)}/${encodeURIComponent(ref.repo)}`,
192+
repo: `${encodeURIComponent(ref.owner)}/${ref.repo}`,
193193
link: resolveURL(baseUrl.blob, dir ?? '', fileName),
194194
host: ref.host,
195195
} satisfies ChangelogMarkdownInfo
@@ -324,7 +324,7 @@ async function checkLatestGitlabRelease(
324324
// I encode both just to be sure
325325
link: `https://${host}/${ref.owner}/${ref.repo}/-/releases`,
326326
provider: ref.provider,
327-
repo: `${encodeURIComponent(ref.owner)}/${encodeURIComponent(ref.repo)}`,
327+
repo: `${encodeURIComponent(ref.owner)}/${ref.repo}`,
328328
host: ref.host,
329329
},
330330
null,
@@ -348,7 +348,7 @@ async function checkLatestGitlabRelease(
348348
provider: ref.provider,
349349
type: 'md',
350350
path,
351-
repo: `${encodeURIComponent(ref.owner)}/${encodeURIComponent(ref.repo)}`,
351+
repo: `${encodeURIComponent(ref.owner)}/${ref.repo}`,
352352
link: matchedChangelog,
353353
host: ref.host,
354354
},

shared/schemas/changelog/release.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,12 @@ export const GitlabReleaseSchame = v.object({
3737
description: v.string(),
3838
released_at: v.pipe(v.string(), v.isoTimestamp()),
3939
upcoming_release: v.boolean(),
40+
commit: v.object({
41+
short_id: v.string(),
42+
}),
43+
_links: v.object({
44+
self: v.pipe(v.string(), v.url()),
45+
}),
4046
})
47+
48+
export const GitlabReleaseCollectionSchema = v.array(GitlabReleaseSchame)

0 commit comments

Comments
 (0)