Skip to content

Commit d0a88fd

Browse files
committed
refactor: use module to inject double route
1 parent a0acb85 commit d0a88fd

9 files changed

Lines changed: 62 additions & 39 deletions

File tree

app/components/PackageCard.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const emit = defineEmits<{
2727
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"
2828
>
2929
<NuxtLink
30-
:to="{ name: 'package', params: getPackagePageParams(result.package.name) }"
30+
:to="getPackageRoute(result.package.name, result.package.version)"
3131
:prefetch-on="prefetch ? 'visibility' : 'interaction'"
3232
class="focus-visible:outline-none decoration-none scroll-mt-48 scroll-mb-6 after:content-[''] after:absolute after:inset-0"
3333
:data-result-index="index"

app/components/PackageDependencies.vue

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ const sortedOptionalDependencies = computed(() => {
5959
class="flex items-center justify-between py-1 text-sm gap-2"
6060
>
6161
<NuxtLink
62-
:to="{ name: 'package', params: getPackagePageParams(dep) }"
62+
:to="getPackageRoute(dep)"
6363
class="font-mono text-fg-muted hover:text-fg transition-colors duration-200 truncate min-w-0"
6464
>
6565
{{ dep }}
@@ -75,7 +75,7 @@ const sortedOptionalDependencies = computed(() => {
7575
<span class="i-carbon-warning-alt w-3 h-3 block" />
7676
</span>
7777
<NuxtLink
78-
:to="{ name: 'package', params: getPackagePageParams(dep, version) }"
78+
:to="getPackageRoute(dep, version)"
7979
class="font-mono text-xs text-right truncate"
8080
:class="getVersionClass(outdatedDeps[dep])"
8181
:title="outdatedDeps[dep] ? getOutdatedTooltip(outdatedDeps[dep]) : version"
@@ -114,7 +114,7 @@ const sortedOptionalDependencies = computed(() => {
114114
>
115115
<div class="flex items-center gap-2 min-w-0">
116116
<NuxtLink
117-
:to="{ name: 'package', params: getPackagePageParams(peer.name) }"
117+
:to="getPackageRoute(peer.name)"
118118
class="font-mono text-fg-muted hover:text-fg transition-colors duration-200 truncate"
119119
>
120120
{{ peer.name }}
@@ -128,10 +128,7 @@ const sortedOptionalDependencies = computed(() => {
128128
</span>
129129
</div>
130130
<NuxtLink
131-
:to="{
132-
name: 'package',
133-
params: getPackagePageParams(peer.name, peer.version),
134-
}"
131+
:to="getPackageRoute(peer.name, peer.version)"
135132
class="font-mono text-xs text-fg-subtle max-w-[40%] text-right truncate"
136133
:title="peer.version"
137134
>
@@ -170,13 +167,13 @@ const sortedOptionalDependencies = computed(() => {
170167
class="flex items-center justify-between py-1 text-sm gap-2"
171168
>
172169
<NuxtLink
173-
:to="{ name: 'package', params: getPackagePageParams(dep) }"
170+
:to="getPackageRoute(dep)"
174171
class="font-mono text-fg-muted hover:text-fg transition-colors duration-200 truncate min-w-0"
175172
>
176173
{{ dep }}
177174
</NuxtLink>
178175
<NuxtLink
179-
:to="{ name: 'package', params: getPackagePageParams(dep, version) }"
176+
:to="getPackageRoute(dep, version)"
180177
class="font-mono text-xs text-fg-subtle max-w-[50%] text-right truncate"
181178
:title="version"
182179
>

app/components/PackageInstallScripts.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const isExpanded = shallowRef(false)
6969
class="flex items-center justify-between py-0.5 text-sm gap-2"
7070
>
7171
<NuxtLink
72-
:to="{ name: 'package', params: getPackagePageParams(dep) }"
72+
:to="getPackageRoute(dep)"
7373
class="font-mono text-fg-muted hover:text-fg transition-colors duration-200 truncate min-w-0"
7474
>
7575
{{ dep }}

app/components/PackageVersions.vue

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,7 @@ function hasProvenance(version: PackumentVersion | undefined): boolean {
3838
3939
// Build route object for package version link
4040
function versionRoute(version: string): RouteLocationRaw {
41-
return {
42-
name: 'package',
43-
params: getPackagePageParams(props.packageName, version),
44-
}
41+
return getPackageRoute(props.packageName, version)
4542
}
4643
4744
// Version to tags lookup (supports multiple tags per version)

app/composables/usePackageRoute.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
1-
export function getPackagePageParams(pkg: string, version: string | null = null) {
1+
export function getPackageRoute(pkg: string, version: string | null = null) {
22
const [org, name] = pkg.startsWith('@') ? pkg.split('/') : [null, pkg]
3+
if (version) {
4+
return {
5+
name: 'package-version',
6+
params: { org, name, version },
7+
} as const
8+
}
39

4-
return { org, name, version }
10+
return {
11+
name: 'package',
12+
params: {
13+
org,
14+
name,
15+
},
16+
} as const
517
}
Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,11 @@ import { areUrlsEquivalent } from '#shared/utils/url'
88
99
definePageMeta({
1010
name: 'package',
11-
/**
12-
* Supported patterns:
13-
* /nuxt → packageName: "nuxt", requestedVersion: null
14-
* /nuxt/v/4.2.0 → packageName: "nuxt", requestedVersion: "4.2.0"
15-
* /@nuxt/kit → packageName: "@nuxt/kit", requestedVersion: null
16-
* /@nuxt/kit/v/1.0.0 → packageName: "@nuxt/kit", requestedVersion: "1.0.0"
17-
* /axios@1.13.3 → packageName: "axios", requestedVersion: "1.13.3"
18-
* /@nuxt/kit@1.0.0 → packageName: "@nuxt/kit", requestedVersion: "1.0.0"
19-
*/
20-
path: '/:org(@[^/]+/)?:name([^@/]+):version()?',
21-
alias: [
22-
'/:org(@[^/]+/)?:name([^@/]+)/v/:version()?',
23-
'/package/:org(@[^/]+/)?:name([^@/]+):version()?',
24-
'/package/:org(@[^/]+/)?:name([^@/]+)/v/:version()?',
25-
],
2611
})
2712
28-
const route = useRoute('package')
29-
13+
// the syntax for matching is complex, so we implement in modules/routing.ts
14+
// which injects a second identical route with required versions
15+
const route = useRoute('package-version')
3016
const router = useRouter()
3117
3218
const orgName = computed(() => route.params.org)

app/pages/code/[...path].vue

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,7 @@ const orgName = computed(() => {
220220
221221
// Build route object for package link (with optional version)
222222
function packageRoute(ver?: string | null) {
223-
return {
224-
name: 'package' as const,
225-
params: getPackagePageParams(packageName.value, ver),
226-
}
223+
return getPackageRoute(packageName.value, ver)
227224
}
228225
229226
// Format file size

app/pages/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ defineOgImageComponent('Default')
9696
:key="pkg"
9797
>
9898
<NuxtLink
99-
:to="{ name: 'package', params: getPackagePageParams(pkg) }"
99+
:to="getPackageRoute(pkg)"
100100
class="link-subtle font-mono text-sm inline-flex items-center gap-2 group"
101101
>
102102
<span

modules/routing.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { defineNuxtModule, useNuxt } from 'nuxt/kit'
2+
3+
export default defineNuxtModule({
4+
meta: {
5+
name: 'routing-extensions',
6+
},
7+
setup() {
8+
const nuxt = useNuxt()
9+
10+
/**
11+
* Supported patterns:
12+
* /nuxt → packageName: "nuxt", requestedVersion: null
13+
* /nuxt/v/4.2.0 → packageName: "nuxt", requestedVersion: "4.2.0"
14+
* /@nuxt/kit → packageName: "@nuxt/kit", requestedVersion: null
15+
* /@nuxt/kit/v/1.0.0 → packageName: "@nuxt/kit", requestedVersion: "1.0.0"
16+
* /axios@1.13.3 → packageName: "axios", requestedVersion: "1.13.3"
17+
* /@nuxt/kit@1.0.0 → packageName: "@nuxt/kit", requestedVersion: "1.0.0"
18+
*/
19+
20+
nuxt.hook('pages:resolved', pages => {
21+
const packagePage = pages.find(page => page.name === 'package')
22+
if (packagePage) {
23+
packagePage.path = '/:org(@[^/]+)?/:name'
24+
packagePage.alias = ['/package/:org(@[^/]+)?/:name']
25+
}
26+
pages.push({
27+
...packagePage,
28+
name: 'package-version',
29+
path: '/:org(@[^/]+)?/:name/v/:version',
30+
alias: ['/:org(@[^/]+)?/:name@:version', '/package/:org(@[^/]+)?/:name/v/:version'],
31+
})
32+
})
33+
},
34+
})

0 commit comments

Comments
 (0)