Skip to content

Commit 0f9b19d

Browse files
committed
fix: load and wait data in og-image-package instead of page level
1 parent 6338a1e commit 0f9b19d

File tree

2 files changed

+56
-41
lines changed

2 files changed

+56
-41
lines changed

app/components/OgImage/Package.vue

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

3070
<template>
@@ -60,7 +100,7 @@ const formattedStars = computed(() =>
60100
class="text-8xl font-bold tracking-tighter"
61101
style="font-family: 'Geist Sans', sans-serif"
62102
>
63-
<span :style="{ color: primaryColor }" class="opacity-80">./</span>{{ name }}
103+
<span :style="{ color: primaryColor }" class="opacity-80">./</span>{{ pkg?.name }}
64104
</h1>
65105
</div>
66106

@@ -77,10 +117,10 @@ const formattedStars = computed(() =>
77117
boxShadow: `0 0 20px ${primaryColor}25`,
78118
}"
79119
>
80-
{{ version }}
120+
{{ resolvedVersion }}
81121
</span>
82122
<span v-if="downloads">
83-
<span>• {{ downloads }} </span>
123+
<span>• {{ $n(downloads.downloads) }} </span>
84124
<span class="flex items-center gap-0">
85125
<svg
86126
width="30"
@@ -99,7 +139,7 @@ const formattedStars = computed(() =>
99139
<span>/wk</span>
100140
</span>
101141
</span>
102-
<span v-if="license"> • {{ license }}</span>
142+
<span v-if="pkg?.license"> • {{ pkg.license }}</span>
103143
<span class="flex items-center gap-2">
104144
<span>•</span>
105145
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32px" height="32px">

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

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ definePageMeta({
2222
alias: ['/:package(.*)*'],
2323
})
2424
25+
defineOgImageComponent('Package', {
26+
name: () => packageName,
27+
version: () => requestedVersion.value ?? '',
28+
primaryColor: '#60a5fa',
29+
})
30+
2531
const router = useRouter()
2632
2733
const header = useTemplateRef('header')
@@ -53,8 +59,6 @@ if (import.meta.server) {
5359
assertValidPackageName(packageName.value)
5460
}
5561
56-
const { data: downloads, refresh: refreshDownloads } = usePackageDownloads(packageName, 'last-week')
57-
5862
// Fetch README for specific version if requested, otherwise latest
5963
const { data: readmeData } = useLazyFetch<ReadmeResponse>(
6064
() => {
@@ -136,7 +140,6 @@ const {
136140
data: pkg,
137141
status,
138142
error,
139-
refresh: refreshPkg,
140143
} = usePackage(packageName, resolvedVersion.value ?? requestedVersion)
141144
const displayVersion = computed(() => pkg.value?.requestedVersion ?? null)
142145
@@ -454,34 +457,6 @@ onKeyStroke(
454457
router.push({ path: '/compare', query: { packages: pkg.value.name } })
455458
},
456459
)
457-
458-
// Wait for all critical data to be received on the server side for correct OG rendering and better results for robots
459-
if (import.meta.server) {
460-
const event = useRequestEvent()
461-
const agent = event?.node.req.headers['user-agent']?.toLowerCase() || ''
462-
const crawlerRegex =
463-
/(facebookexternalhit|bluesky|twitterbot|linkedinbot|discordbot|slackbot|telegrambot|whatsapp|vkshare|skypeuripreview|googlebot|bingbot|yandexbot|baiduspider|duckduckbot|crawler|spider|bot|preview)/i
464-
465-
const isCrawler = crawlerRegex.test(agent)
466-
467-
if (isCrawler) {
468-
try {
469-
await refreshPkg()
470-
await Promise.all([refreshRepoMeta(), refreshDownloads()])
471-
} catch (err) {
472-
console.warn('[crawler-refresh] Failed to refresh data server-side:', err)
473-
}
474-
}
475-
}
476-
477-
defineOgImageComponent('Package', {
478-
name: () => pkg.value?.name ?? 'Package',
479-
version: () => resolvedVersion.value ?? '',
480-
downloads: () => (downloads.value ? $n(downloads.value.downloads) : ''),
481-
license: () => pkg.value?.license ?? '',
482-
stars: () => repoMeta.value?.stars ?? 0,
483-
primaryColor: '#60a5fa',
484-
})
485460
</script>
486461

487462
<template>

0 commit comments

Comments
 (0)