diff --git a/app/components/ClaimPackageModal.vue b/app/components/ClaimPackageModal.vue index 60cfaa3f..926eafde 100644 --- a/app/components/ClaimPackageModal.vue +++ b/app/components/ClaimPackageModal.vue @@ -192,7 +192,7 @@ const connectorModalOpen = shallowRef(false)
@@ -299,7 +299,7 @@ const connectorModalOpen = shallowRef(false)
diff --git a/app/components/HeaderPackagesDropdown.vue b/app/components/HeaderPackagesDropdown.vue index 4c6a09c3..2ed367e0 100644 --- a/app/components/HeaderPackagesDropdown.vue +++ b/app/components/HeaderPackagesDropdown.vue @@ -94,7 +94,7 @@ function handleKeydown(event: KeyboardEvent) {
  • {{ pkg }} diff --git a/app/components/PackageCard.vue b/app/components/PackageCard.vue index 0db5531b..3b30ac21 100644 --- a/app/components/PackageCard.vue +++ b/app/components/PackageCard.vue @@ -46,7 +46,7 @@ const emit = defineEmits<{ class="font-mono text-sm sm:text-base font-medium text-fg group-hover:text-fg transition-colors duration-200 min-w-0 break-all" > { class="flex items-center justify-between py-1 text-sm gap-2" > {{ dep }} @@ -109,10 +109,7 @@ const sortedOptionalDependencies = computed(() => { { {{ $t('package.dependencies.view_vulnerabilities') }} { >
    {{ peer.name }} @@ -194,10 +191,7 @@ const sortedOptionalDependencies = computed(() => {
    @@ -252,13 +246,13 @@ const sortedOptionalDependencies = computed(() => { class="flex items-center justify-between py-1 text-sm gap-2" > {{ dep }} diff --git a/app/components/PackageInstallScripts.vue b/app/components/PackageInstallScripts.vue index c3bad2e9..85542e76 100644 --- a/app/components/PackageInstallScripts.vue +++ b/app/components/PackageInstallScripts.vue @@ -75,7 +75,7 @@ const isExpanded = shallowRef(false) class="flex items-center justify-between py-0.5 text-sm gap-2" > {{ dep }} diff --git a/app/components/PackageVersions.vue b/app/components/PackageVersions.vue index 2c111134..deb8b584 100644 --- a/app/components/PackageVersions.vue +++ b/app/components/PackageVersions.vue @@ -41,10 +41,7 @@ function hasProvenance(version: PackumentVersion | undefined): boolean { // Build route object for package version link function versionRoute(version: string): RouteLocationRaw { - return { - name: 'package', - params: { package: [...props.packageName.split('/'), 'v', version] }, - } + return getPackageRoute(props.packageName, version) } // Version to tags lookup (supports multiple tags per version) diff --git a/app/components/VersionSelector.vue b/app/components/VersionSelector.vue index c8f67e3d..e159dd50 100644 --- a/app/components/VersionSelector.vue +++ b/app/components/VersionSelector.vue @@ -625,7 +625,7 @@ watch(
    diff --git a/app/composables/usePackageRoute.ts b/app/composables/usePackageRoute.ts index f90a31d2..8b991daf 100644 --- a/app/composables/usePackageRoute.ts +++ b/app/composables/usePackageRoute.ts @@ -1,3 +1,22 @@ +/** + * Generate a route object for navigating to a package page. + * + * @param pkg - Package name (e.g., "nuxt" or "@nuxt/kit") + * @param version - Optional version string + * @returns Route object with name and params + * @public + */ +export function getPackageRoute(pkg: string, version: string | null = null) { + return { + name: 'package', + params: { + package: [...pkg.split('/'), version ? 'v' : null, version].filter( + (a): a is NonNullable => !!a, + ), + }, + } as const +} + /** * Parse package name and optional version from the route URL. * @@ -13,7 +32,7 @@ export function usePackageRoute() { const route = useRoute('package') - const parsedRoute = computed(() => { + const data = computed(() => { const segments = route.params.package || [] // Find the /v/ separator for version @@ -42,20 +61,8 @@ export function usePackageRoute() { } }) - const packageName = computed(() => parsedRoute.value.packageName) - const requestedVersion = computed(() => parsedRoute.value.requestedVersion) - - // Extract org name from scoped package (e.g., "@nuxt/kit" -> "nuxt") - const orgName = computed(() => { - const name = packageName.value - if (!name.startsWith('@')) return null - const match = name.match(/^@([^/]+)\//) - return match ? match[1] : null - }) - return { - packageName, - requestedVersion, - orgName, + packageName: computed(() => data.value.packageName), + requestedVersion: computed(() => data.value.requestedVersion), } } diff --git a/app/pages/[...package].vue b/app/pages/[...package].vue index 99a8078e..026131f4 100644 --- a/app/pages/[...package].vue +++ b/app/pages/[...package].vue @@ -13,7 +13,15 @@ definePageMeta({ const router = useRouter() -const { packageName, requestedVersion, orgName } = usePackageRoute() +const { packageName, requestedVersion } = usePackageRoute() + +const orgName = computed(() => { + const name = packageName.value + if (!name.startsWith('@')) return null + + const match = name.match(/^@([^/]+)\//) + return match ? match[1] : null +}) if (import.meta.server) { assertValidPackageName(packageName.value) @@ -472,7 +480,7 @@ defineOgImageComponent('Package', { {{ displayVersion.version }} @@ -993,7 +1001,7 @@ defineOgImageComponent('Package', { > @@ -1077,7 +1085,7 @@ defineOgImageComponent('Package', { }} diff --git a/app/pages/code/[...path].vue b/app/pages/code/[...path].vue index 86809c03..e01ff908 100644 --- a/app/pages/code/[...path].vue +++ b/app/pages/code/[...path].vue @@ -188,11 +188,7 @@ const orgName = computed(() => { // Build route object for package link (with optional version) function packageRoute(ver?: string | null) { - const segments = packageName.value.split('/') - if (ver) { - segments.push('v', ver) - } - return { name: 'package' as const, params: { package: segments } } + return getPackageRoute(packageName.value, ver) } // Format file size diff --git a/app/pages/index.vue b/app/pages/index.vue index 5c07d9ac..720a26cc 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -110,7 +110,7 @@ defineOgImageComponent('Default') :key="pkg" >