11<script setup lang="ts">
22import { computed , toRefs } from ' vue'
3+ import { joinURL } from ' ufo'
34
45const 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
2252const 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" >
0 commit comments