Skip to content

Commit c7ba252

Browse files
alexdlndanielroe
andauthored
fix: finish getting star metadata when rendering og images (#933)
Co-authored-by: Daniel Roe <daniel@roe.dev>
1 parent 58da157 commit c7ba252

File tree

4 files changed

+61
-23
lines changed

4 files changed

+61
-23
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
declare const _default: any
2+
3+
export default _default

app/components/OgImage/Package.vue

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,69 @@
11
<script setup lang="ts">
2-
import { computed, toRefs } from 'vue'
2+
import { joinURL } from 'ufo'
33
44
const props = withDefaults(
55
defineProps<{
66
name: string
77
version: string
8-
stars: number
9-
downloads?: string
10-
license?: string
118
primaryColor?: string
129
}>(),
1310
{
14-
downloads: '',
15-
license: '',
1611
primaryColor: '#60a5fa',
1712
},
1813
)
1914
20-
const { name, version, stars, downloads, license, primaryColor } = toRefs(props)
15+
const { name, version, primaryColor } = toRefs(props)
16+
17+
const {
18+
data: resolvedVersion,
19+
status: versionStatus,
20+
error: versionError,
21+
} = await useResolvedVersion(name, version)
22+
23+
if (
24+
versionStatus.value === 'error' &&
25+
versionError.value?.statusCode &&
26+
versionError.value.statusCode >= 400 &&
27+
versionError.value.statusCode < 500
28+
) {
29+
throw createError({
30+
statusCode: 404,
31+
})
32+
}
33+
34+
const { data: downloads, refresh: refreshDownloads } = usePackageDownloads(name, 'last-week')
35+
const { data: pkg, refresh: refreshPkg } = usePackage(name, resolvedVersion.value ?? version.value)
36+
const displayVersion = computed(() => pkg.value?.requestedVersion ?? null)
37+
38+
const repositoryUrl = computed(() => {
39+
const repo = displayVersion.value?.repository
40+
if (!repo?.url) return null
41+
let url = normalizeGitUrl(repo.url)
42+
// append `repository.directory` for monorepo packages
43+
if (repo.directory) {
44+
url = joinURL(`${url}/tree/HEAD`, repo.directory)
45+
}
46+
return url
47+
})
48+
49+
const { stars, refresh: refreshRepoMeta } = useRepoMeta(repositoryUrl)
2150
2251
const formattedStars = computed(() =>
2352
Intl.NumberFormat('en', {
2453
notation: 'compact',
2554
maximumFractionDigits: 1,
2655
}).format(stars.value),
2756
)
57+
58+
try {
59+
await refreshPkg()
60+
await Promise.all([refreshRepoMeta(), refreshDownloads()])
61+
} catch (err) {
62+
console.warn('[og-image-package] Failed to load data server-side:', err)
63+
throw createError({
64+
statusCode: 404,
65+
})
66+
}
2867
</script>
2968

3069
<template>
@@ -60,7 +99,7 @@ const formattedStars = computed(() =>
6099
class="text-8xl font-bold tracking-tighter"
61100
style="font-family: 'Geist Sans', sans-serif"
62101
>
63-
<span :style="{ color: primaryColor }" class="opacity-80">./</span>{{ name }}
102+
<span :style="{ color: primaryColor }" class="opacity-80">./</span>{{ pkg?.name }}
64103
</h1>
65104
</div>
66105

@@ -77,10 +116,10 @@ const formattedStars = computed(() =>
77116
boxShadow: `0 0 20px ${primaryColor}25`,
78117
}"
79118
>
80-
{{ version }}
119+
{{ resolvedVersion }}
81120
</span>
82121
<span v-if="downloads">
83-
<span>• {{ downloads }} </span>
122+
<span>• {{ $n(downloads.downloads) }} </span>
84123
<span class="flex items-center gap-0">
85124
<svg
86125
width="30"
@@ -99,7 +138,7 @@ const formattedStars = computed(() =>
99138
<span>/wk</span>
100139
</span>
101140
</span>
102-
<span v-if="license"> • {{ license }}</span>
141+
<span v-if="pkg?.license"> • {{ pkg.license }}</span>
103142
<span class="flex items-center gap-2">
104143
<span>•</span>
105144
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32px" height="32px">

app/pages/package/[...package].vue

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ definePageMeta({
2323
alias: ['/:package(.*)*'],
2424
})
2525
26+
defineOgImageComponent('Package', {
27+
name: () => packageName.value,
28+
version: () => requestedVersion.value ?? '',
29+
primaryColor: '#60a5fa',
30+
})
31+
2632
const router = useRouter()
2733
2834
const header = useTemplateRef('header')
@@ -54,8 +60,6 @@ if (import.meta.server) {
5460
assertValidPackageName(packageName.value)
5561
}
5662
57-
const { data: downloads } = usePackageDownloads(packageName, 'last-week')
58-
5963
// Fetch README for specific version if requested, otherwise latest
6064
const { data: readmeData } = useLazyFetch<ReadmeResponse>(
6165
() => {
@@ -137,7 +141,7 @@ const {
137141
data: pkg,
138142
status,
139143
error,
140-
} = usePackage(packageName, resolvedVersion.value ?? requestedVersion)
144+
} = usePackage(packageName, resolvedVersion.value ?? requestedVersion.value)
141145
const displayVersion = computed(() => pkg.value?.requestedVersion ?? null)
142146
143147
// Process package description
@@ -488,15 +492,6 @@ onKeyStroke(
488492
router.push({ path: '/compare', query: { packages: pkg.value.name } })
489493
},
490494
)
491-
492-
defineOgImageComponent('Package', {
493-
name: () => pkg.value?.name ?? 'Package',
494-
version: () => resolvedVersion.value ?? '',
495-
downloads: () => (downloads.value ? $n(downloads.value.downloads) : ''),
496-
license: () => pkg.value?.license ?? '',
497-
stars: () => stars.value ?? 0,
498-
primaryColor: '#60a5fa',
499-
})
500495
</script>
501496

502497
<template>

knip.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const config: KnipConfig = {
88
'app/error.vue!',
99
'app/pages/**/*.vue!',
1010
'app/components/**/*.vue!',
11+
'app/components/**/*.d.vue.ts!',
1112
'app/composables/**/*.ts!',
1213
'app/middleware/**/*.ts!',
1314
'app/plugins/**/*.ts!',

0 commit comments

Comments
 (0)