Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/components/OgImage/Package.d.vue.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const _default: any

export default _default
61 changes: 50 additions & 11 deletions app/components/OgImage/Package.vue
Original file line number Diff line number Diff line change
@@ -1,30 +1,69 @@
<script setup lang="ts">
import { computed, toRefs } from 'vue'
import { joinURL } from 'ufo'

const props = withDefaults(
defineProps<{
name: string
version: string
stars: number
downloads?: string
license?: string
primaryColor?: string
}>(),
{
downloads: '',
license: '',
primaryColor: '#60a5fa',
},
)

const { name, version, stars, downloads, license, primaryColor } = toRefs(props)
const { name, version, primaryColor } = toRefs(props)

const {
data: resolvedVersion,
status: versionStatus,
error: versionError,
} = await useResolvedVersion(name, version)

if (
versionStatus.value === 'error' &&
versionError.value?.statusCode &&
versionError.value.statusCode >= 400 &&
versionError.value.statusCode < 500
) {
throw createError({
statusCode: 404,
})
}

const { data: downloads, refresh: refreshDownloads } = usePackageDownloads(name, 'last-week')
const { data: pkg, refresh: refreshPkg } = usePackage(name, resolvedVersion.value ?? version.value)
const displayVersion = computed(() => pkg.value?.requestedVersion ?? null)

const repositoryUrl = computed(() => {
const repo = displayVersion.value?.repository
if (!repo?.url) return null
let url = normalizeGitUrl(repo.url)
// append `repository.directory` for monorepo packages
if (repo.directory) {
url = joinURL(`${url}/tree/HEAD`, repo.directory)
}
return url
})

const { stars, refresh: refreshRepoMeta } = useRepoMeta(repositoryUrl)

const formattedStars = computed(() =>
Intl.NumberFormat('en', {
notation: 'compact',
maximumFractionDigits: 1,
}).format(stars.value),
)

try {
await refreshPkg()
await Promise.all([refreshRepoMeta(), refreshDownloads()])
} catch (err) {
console.warn('[og-image-package] Failed to load data server-side:', err)
throw createError({
statusCode: 404,
})
}
</script>

<template>
Expand Down Expand Up @@ -60,7 +99,7 @@ const formattedStars = computed(() =>
class="text-8xl font-bold tracking-tighter"
style="font-family: 'Geist Sans', sans-serif"
>
<span :style="{ color: primaryColor }" class="opacity-80">./</span>{{ name }}
<span :style="{ color: primaryColor }" class="opacity-80">./</span>{{ pkg?.name }}
</h1>
</div>

Expand All @@ -77,10 +116,10 @@ const formattedStars = computed(() =>
boxShadow: `0 0 20px ${primaryColor}25`,
}"
>
{{ version }}
{{ resolvedVersion }}
</span>
<span v-if="downloads">
<span>• {{ downloads }} </span>
<span>• {{ $n(downloads.downloads) }} </span>
<span class="flex items-center gap-0">
<svg
width="30"
Expand All @@ -99,7 +138,7 @@ const formattedStars = computed(() =>
<span>/wk</span>
</span>
</span>
<span v-if="license"> • {{ license }}</span>
<span v-if="pkg?.license"> • {{ pkg.license }}</span>
<span class="flex items-center gap-2">
<span>•</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32px" height="32px">
Expand Down
19 changes: 7 additions & 12 deletions app/pages/package/[...package].vue
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ definePageMeta({
alias: ['/:package(.*)*'],
})

defineOgImageComponent('Package', {
name: () => packageName.value,
version: () => requestedVersion.value ?? '',
primaryColor: '#60a5fa',
})

const router = useRouter()

const header = useTemplateRef('header')
Expand Down Expand Up @@ -53,8 +59,6 @@ if (import.meta.server) {
assertValidPackageName(packageName.value)
}

const { data: downloads } = usePackageDownloads(packageName, 'last-week')

// Fetch README for specific version if requested, otherwise latest
const { data: readmeData } = useLazyFetch<ReadmeResponse>(
() => {
Expand Down Expand Up @@ -136,7 +140,7 @@ const {
data: pkg,
status,
error,
} = usePackage(packageName, resolvedVersion.value ?? requestedVersion)
} = usePackage(packageName, resolvedVersion.value ?? requestedVersion.value)
const displayVersion = computed(() => pkg.value?.requestedVersion ?? null)

// Process package description
Expand Down Expand Up @@ -445,15 +449,6 @@ onKeyStroke(
router.push({ path: '/compare', query: { packages: pkg.value.name } })
},
)

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,
primaryColor: '#60a5fa',
})
</script>

<template>
Expand Down
Loading