11<script setup lang="ts">
2- import { computed , toRefs } from ' vue '
2+ import { joinURL } from ' ufo '
33
44const 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
2251const 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" >
0 commit comments