From d48b2f8e195185b22615c7dc6e34769209dee863 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Wed, 4 Feb 2026 11:43:53 +0000 Subject: [PATCH 1/8] fix: wait page readiness for robots and og --- app/pages/package/[...package].vue | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/app/pages/package/[...package].vue b/app/pages/package/[...package].vue index 11be99087..7d3e2cc29 100644 --- a/app/pages/package/[...package].vue +++ b/app/pages/package/[...package].vue @@ -53,7 +53,7 @@ if (import.meta.server) { assertValidPackageName(packageName.value) } -const { data: downloads } = usePackageDownloads(packageName, 'last-week') +const { data: downloads, refresh: refreshDownloads } = usePackageDownloads(packageName, 'last-week') // Fetch README for specific version if requested, otherwise latest const { data: readmeData } = useLazyFetch( @@ -136,6 +136,7 @@ const { data: pkg, status, error, + refresh: refreshPkg, } = usePackage(packageName, resolvedVersion.value ?? requestedVersion) const displayVersion = computed(() => pkg.value?.requestedVersion ?? null) @@ -243,7 +244,15 @@ const repositoryUrl = computed(() => { return url }) -const { meta: repoMeta, repoRef, stars, starsLink, forks, forksLink } = useRepoMeta(repositoryUrl) +const { + meta: repoMeta, + repoRef, + stars, + starsLink, + forks, + forksLink, + refresh: refreshRepoMeta, +} = useRepoMeta(repositoryUrl) const PROVIDER_ICONS: Record = { github: 'i-carbon:logo-github', @@ -446,12 +455,27 @@ onKeyStroke( }, ) +// Wait for all critical data to be received on the server side for correct OG rendering and better results for robots +if (import.meta.server) { + const event = useRequestEvent() + const agent = event?.node.req.headers['user-agent']?.toLowerCase() || '' + const crawlerRegex = + /(facebookexternalhit|bluesky|twitterbot|linkedinbot|discordbot|slackbot|telegrambot|whatsapp|vkshare|skypeuripreview|googlebot|bingbot|yandexbot|baiduspider|duckduckbot|crawler|spider|bot|preview)/i + + const isCrawler = crawlerRegex.test(agent) + + if (isCrawler) { + await refreshPkg() + await Promise.all([refreshRepoMeta(), refreshDownloads()]) + } +} + defineOgImageComponent('Package', { name: () => pkg.value?.name ?? 'Package', version: () => resolvedVersion.value ?? '', downloads: () => (downloads.value ? $n(downloads.value.downloads) : ''), license: () => pkg.value?.license ?? '', - stars: () => stars.value ?? 0, + stars: () => repoMeta.value?.stars ?? 0, primaryColor: '#60a5fa', }) From 6338a1ecf018fab0083da7b3b07652419695d374 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Wed, 4 Feb 2026 12:12:49 +0000 Subject: [PATCH 2/8] fix: add try-catch for server refresh wait --- app/pages/package/[...package].vue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/pages/package/[...package].vue b/app/pages/package/[...package].vue index 5ac59fa15..1aec7b44b 100644 --- a/app/pages/package/[...package].vue +++ b/app/pages/package/[...package].vue @@ -465,8 +465,12 @@ if (import.meta.server) { const isCrawler = crawlerRegex.test(agent) if (isCrawler) { - await refreshPkg() - await Promise.all([refreshRepoMeta(), refreshDownloads()]) + try { + await refreshPkg() + await Promise.all([refreshRepoMeta(), refreshDownloads()]) + } catch (err) { + console.warn('[crawler-refresh] Failed to refresh data server-side:', err) + } } } From 0f9b19d46ef7e749bd391ad046a17666c51f0e50 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Wed, 4 Feb 2026 13:11:22 +0000 Subject: [PATCH 3/8] fix: load and wait data in og-image-package instead of page level --- app/components/OgImage/Package.vue | 60 +++++++++++++++++++++++++----- app/pages/package/[...package].vue | 37 +++--------------- 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/app/components/OgImage/Package.vue b/app/components/OgImage/Package.vue index 5716ebc0d..dcf6fb05b 100644 --- a/app/components/OgImage/Package.vue +++ b/app/components/OgImage/Package.vue @@ -1,23 +1,53 @@