Skip to content

Commit 5efdb53

Browse files
WilcoSpautofix-ci[bot]ghostdevv
authored
feat: combining shared code markdown renderer readme & changelog (#2717)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Willow (GHOST) <git@willow.sh>
1 parent 1880374 commit 5efdb53

28 files changed

Lines changed: 1489 additions & 816 deletions

File tree

app/components/Changelog/Card.vue

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script setup lang="ts">
2+
import type { IconClass } from '~/types'
23
import type { ReleaseData } from '~~/shared/types/changelog'
34
import { slugify } from '~~/shared/utils/html'
45
@@ -19,6 +20,14 @@ const navId = computed(() => `release-${slugify(release.title)}`)
1920
function navigateToTitle() {
2021
navigateTo(`#${navId.value}`)
2122
}
23+
24+
const { providerIcon, viewOnProvider } = inject<{
25+
providerIcon: MaybeRef<IconClass>
26+
viewOnProvider: MaybeRef<string>
27+
}>('changelog-provider-linkattr', {
28+
providerIcon: 'i-lucide:code',
29+
viewOnProvider: computed(() => $t('common.view_on.git_repo')),
30+
})
2231
</script>
2332
<template>
2433
<section
@@ -48,6 +57,12 @@ function navigateToTitle() {
4857
{{ $t('changelog.draft') }}
4958
</TagStatic>
5059
<div class="flex-1" aria-hidden="true"></div>
60+
<LinkBase
61+
:classicon="providerIcon"
62+
:title="viewOnProvider"
63+
:to="release.link"
64+
class="size-[0.9em]"
65+
/>
5166
<ReadmeTocDropdown
5267
v-if="release?.toc && release.toc.length > 1"
5368
:toc="release.toc"

app/components/Changelog/Markdown.vue

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const { info, goToVersion, tpTarget, resolveVersionPending } = defineProps<{
88
99
const route = useRoute()
1010
11-
const { data, error } = await useLazyFetch(
11+
const { data, error, pending } = useLazyFetch(
1212
() => `/api/changelog/md/${info.provider}/${info.repo}/${info.path}`,
1313
)
1414
@@ -34,8 +34,11 @@ if (import.meta.client) {
3434
}
3535
// lc = lower case
3636
const lcRequestedVersion = goToVersion.toLowerCase()
37+
const isMatching = createHeadingVersionMatcher(lcRequestedVersion)
38+
3739
for (const item of toc) {
38-
if (item.text.toLowerCase().includes(lcRequestedVersion)) {
40+
const text = item.text.toLowerCase()
41+
if (text.toLowerCase().includes(lcRequestedVersion) && isMatching(text)) {
3942
navigateTo(`#${item.id}`)
4043
return
4144
}
@@ -49,9 +52,12 @@ if (import.meta.client) {
4952
}
5053
</script>
5154
<template>
52-
<Teleport v-if="data?.toc && data.toc.length > 1 && !!tpTarget" :to="tpTarget">
53-
<ReadmeTocDropdown :toc="data.toc" class="justify-self-end" />
54-
</Teleport>
55-
<Readme v-if="data?.html" :html="data.html" class="pt-4"></Readme>
55+
<ChangelogSkeleton v-if="pending" />
56+
<template v-else-if="data?.html">
57+
<Teleport v-if="data?.toc && data.toc.length > 1 && !!tpTarget" :to="tpTarget">
58+
<ReadmeTocDropdown :toc="data.toc" class="justify-self-end" />
59+
</Teleport>
60+
<Readme :html="data.html" class="pt-4"></Readme>
61+
</template>
5662
<slot v-else-if="error" name="error"></slot>
5763
</template>

app/components/Changelog/Releases.vue

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ const { info, requestedDate, goToVersion, resolveVersionPending } = defineProps<
88
resolveVersionPending?: boolean
99
}>()
1010
11-
const { data: releases, error } = await useLazyFetch<ReleaseData[]>(
12-
() => `/api/changelog/releases/${info.provider}/${info.repo}`,
13-
)
11+
const {
12+
data: releases,
13+
error,
14+
pending,
15+
} = useLazyFetch<ReleaseData[]>(() => `/api/changelog/releases/${info.provider}/${info.repo}`)
1416
1517
const route = useRoute()
1618
@@ -23,7 +25,7 @@ const matchingDateReleases = computed(() => {
2325
if (!release.publishedAt) {
2426
return
2527
}
26-
return requestedDate === toIsoDate(new Date(release.publishedAt))
28+
return requestedDate === release.publishedAt.slice(0, 10)
2729
})
2830
})
2931
@@ -75,7 +77,8 @@ if (import.meta.client) {
7577
prefetchComponents('ChangelogCard')
7678
</script>
7779
<template>
78-
<div class="flex flex-col gap-2 py-3" v-if="releases">
80+
<ChangelogSkeleton v-if="pending" />
81+
<div class="flex flex-col gap-2 py-3" v-else-if="releases">
7982
<ChangelogCard v-for="release of releases" :release :key="release.id" />
8083
</div>
8184
<slot v-else-if="error" name="error"></slot>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<template>
2+
<SkeletonBlock class="h-8 w-40 rounded" />
3+
<ul class="ms-3 list-disc my-4 ps-6 marker:color-[--border-hover]">
4+
<li class="mb-1" v-for="_n in 5">
5+
<SkeletonBlock class="h-7 w-full max-w-2xl rounded" />
6+
</li>
7+
</ul>
8+
9+
<SkeletonBlock class="h-5 w-5/6 max-w-2xl rounded" />
10+
<SkeletonBlock class="h-5 w-3/4 max-w-2xl rounded" />
11+
</template>

app/components/OgImage/Package.takumi.vue

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,6 @@ import { joinURL } from 'ufo'
1818
import { useCharts } from '~/composables/useCharts'
1919
import { createSmoothPath } from 'vue-data-ui/utils'
2020
21-
const REPO_PROVIDER_ICONS: Record<string, string> = {
22-
github: 'i-simple-icons:github',
23-
gitlab: 'i-simple-icons:gitlab',
24-
bitbucket: 'i-simple-icons:bitbucket',
25-
codeberg: 'i-simple-icons:codeberg',
26-
gitea: 'i-simple-icons:gitea',
27-
forgejo: 'i-simple-icons:forgejo',
28-
gitee: 'i-simple-icons:gitee',
29-
sourcehut: 'i-simple-icons:sourcehut',
30-
tangled: 'i-custom:tangled',
31-
radicle: 'i-lucide:network',
32-
}
33-
3421
function sortJsDelivrNodes(nodes: JsDelivrFileNode[]) {
3522
return [...nodes].sort((a, b) => {
3623
if (a.type !== b.type) return a.type === 'directory' ? -1 : 1
@@ -76,10 +63,7 @@ const repositoryUrl = computed(() => {
7663
})
7764
7865
const { repoRef, stars, refresh: refreshRepoMeta } = useRepoMeta(repositoryUrl)
79-
const repoProviderIcon = computed(() => {
80-
const provider = repoRef.value?.provider
81-
return provider ? (REPO_PROVIDER_ICONS[provider] ?? 'i-lucide:code') : 'i-lucide:code'
82-
})
66+
const repoProviderIcon = useProviderIcon(() => repoRef.value?.provider, 'i-lucide:code')
8367
8468
const formattedStars = computed(() => (stars.value > 0 ? compactFormat.format(stars.value) : ''))
8569

app/components/Package/ExternalLinks.vue

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<script setup lang="ts">
2-
import type { IconClass } from '~/types'
32
import type { CommandPaletteContextCommandInput } from '~/types/command-palette'
43
54
const props = defineProps<{
@@ -24,24 +23,7 @@ const homepageUrl = computed(() => {
2423
return homepage
2524
})
2625
27-
const PROVIDER_ICONS: Record<string, IconClass> = {
28-
github: 'i-simple-icons:github',
29-
gitlab: 'i-simple-icons:gitlab',
30-
bitbucket: 'i-simple-icons:bitbucket',
31-
codeberg: 'i-simple-icons:codeberg',
32-
gitea: 'i-simple-icons:gitea',
33-
forgejo: 'i-simple-icons:forgejo',
34-
gitee: 'i-simple-icons:gitee',
35-
sourcehut: 'i-simple-icons:sourcehut',
36-
tangled: 'i-custom:tangled',
37-
radicle: 'i-lucide:network', // Radicle is a P2P network, using network icon
38-
}
39-
40-
const repoProviderIcon = computed((): IconClass => {
41-
const provider = repoRef.value?.provider
42-
if (!provider) return 'i-simple-icons:github'
43-
return PROVIDER_ICONS[provider] ?? 'i-lucide:code'
44-
})
26+
const repoProviderIcon = useProviderIcon(() => repoRef.value?.provider)
4527
4628
const repositoryCommandLabel = computed(() => {
4729
if (!repoRef.value) {

app/components/Package/Header.vue

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import type { RouteLocationRaw } from 'vue-router'
33
import type { CommandPaletteContextCommandInput } from '~/types/command-palette'
44
import { SCROLL_TO_TOP_THRESHOLD } from '~/composables/useScrollToTop'
5-
import { usePackageChangelog } from '~/composables/usePackageChangelog'
65
76
const props = defineProps<{
87
pkg?: Pick<SlimPackument, 'name' | 'versions' | 'dist-tags'> | null
@@ -163,12 +162,15 @@ const diffLink = computed((): RouteLocationRaw | null => {
163162
return diffRoute(props.pkg.name, props.resolvedVersion, props.latestVersion.version)
164163
})
165164
166-
const { data: changelog } = usePackageChangelog(packageName, requestedVersion)
167-
165+
const hasChangelog = usePackageHasChangelog(
166+
packageName,
167+
() => requestedVersion.value || props.resolvedVersion,
168+
true,
169+
)
168170
const changelogLink = computed((): RouteLocationRaw | null => {
169171
if (
170172
// either changelog.value is available or current page is the changelog
171-
!(changelog.value || props.page == 'changelog') ||
173+
!(hasChangelog.value || props.page == 'changelog') ||
172174
props.pkg == null ||
173175
props.resolvedVersion == null
174176
) {

app/composables/useCommandPalettePackageCommands.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,7 @@ export function useCommandPalettePackageCommands(
2727
.includes(packageName)
2828
}
2929

30-
const { data: changelog } = usePackageChangelog(
31-
() => toValue(context)?.packageName,
32-
() => toValue(context)?.resolvedVersion,
33-
)
30+
const hasChangelog = usePackageHasChangelogFromState()
3431

3532
useCommandPaletteContextCommands(
3633
computed((): CommandPaletteContextCommandInput[] => {
@@ -119,8 +116,7 @@ export function useCommandPalettePackageCommands(
119116
},
120117
]
121118

122-
const uChangelog = changelog.value
123-
if (uChangelog?.type === 'md' || uChangelog?.type === 'release') {
119+
if (hasChangelog.value) {
124120
commands.push({
125121
id: 'package-changelog',
126122
group: 'package',
Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,38 @@
11
import type { ChangelogInfo } from '~~/shared/types/changelog'
22

3+
const KEY = 'changelog:has:info'
4+
35
export function usePackageChangelog(
4-
packageName: MaybeRefOrGetter<string | null | undefined>,
6+
packageName: MaybeRefOrGetter<string>,
57
version?: MaybeRefOrGetter<string | null | undefined>,
68
) {
79
return useLazyFetch<ChangelogInfo | null>(() => {
810
const name = toValue(packageName)
9-
if (!name) return 'data:application/json,null' // returns null
1011
const ver = toValue(version)
1112
return `/api/changelog/info/${name}/v/${ver || 'latest'}`
1213
})
1314
}
15+
16+
/**
17+
* check whether the current package & version has changelogs
18+
* @param setState with `useState` also set the state of `changelog:info` (currently only for packageHeader)
19+
*/
20+
export function usePackageHasChangelog(
21+
packageName: MaybeRefOrGetter<string>,
22+
version?: MaybeRefOrGetter<string | null | undefined>,
23+
setState?: boolean,
24+
) {
25+
const { data } = usePackageChangelog(packageName, version)
26+
const hasChangelog = computed(() => data.value?.type == 'md' || data.value?.type == 'release')
27+
if (setState) {
28+
useState(KEY, () => hasChangelog)
29+
}
30+
return hasChangelog
31+
}
32+
33+
/**
34+
* get whether current package has changelog via `useState` (is needed for command pallette)
35+
*/
36+
export function usePackageHasChangelogFromState() {
37+
return useState<boolean>(KEY)
38+
}

app/composables/useProviderIcon.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@ const PROVIDER_ICONS: Record<ProviderId, IconClass> = {
1515
radicle: 'i-lucide:network', // Radicle is a P2P network, using network icon
1616
}
1717

18-
export function useProviderIcon(provider: MaybeRefOrGetter<ProviderId | null | undefined>) {
18+
export function useProviderIcon(
19+
provider: MaybeRefOrGetter<ProviderId | null | undefined>,
20+
fallbackIcon: IconClass = 'i-simple-icons:github',
21+
) {
1922
return computed((): IconClass => {
2023
const uProvider = toValue(provider)
21-
if (!uProvider) return 'i-simple-icons:github'
24+
if (!uProvider) return fallbackIcon
2225
return PROVIDER_ICONS[uProvider] ?? 'i-lucide:code'
2326
})
2427
}

0 commit comments

Comments
 (0)