Skip to content

Commit 4972d0e

Browse files
committed
feat: new routing schema - pages moved, redirect middleware updated
1 parent 1c8e14b commit 4972d0e

File tree

4 files changed

+49
-22
lines changed

4 files changed

+49
-22
lines changed
Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,49 @@
11
/**
22
* Redirect legacy URLs to canonical paths (client-side only)
33
*
4-
* - /package/* → /*
5-
* - /package/code/* → /code/*
4+
* - /package/code/* → /package-code/*
5+
* - /code/* → /package-code/*
6+
* - /package/docs/* → /package-docs/*
7+
* - /docs/* → /package-docs/*
68
* - /org/* → /@*
9+
* - /* → /package/* (Unless its an existing page)
710
*/
811
export default defineNuxtRouteMiddleware(to => {
912
// Only redirect on client-side to avoid breaking crawlers mid-transition
1013
if (import.meta.server) return
1114

1215
const path = to.path
1316

14-
// /package/code/* → /code/*
17+
// /package/code/* → /package-code/*
1518
if (path.startsWith('/package/code/')) {
16-
return navigateTo(path.replace('/package/code/', '/code/'), { replace: true })
19+
return navigateTo(path.replace('/package/code/', '/package-code/'), { replace: true })
20+
}
21+
// /code/* → /package-code/*
22+
if (path.startsWith('/code/')) {
23+
return navigateTo(path.replace('/code/', '/package-code/'), { replace: true })
1724
}
1825

19-
// /package/* → /*
20-
if (path.startsWith('/package/')) {
21-
return navigateTo(path.replace('/package/', '/'), { replace: true })
26+
// /package/docs/* → /package-docs/*
27+
if (path.startsWith('/package/docs/')) {
28+
return navigateTo(path.replace('/package/docs/', '/package-docs/'), { replace: true })
29+
}
30+
// /docs/* → /package-docs/*
31+
if (path.startsWith('/docs/')) {
32+
return navigateTo(path.replace('/docs/', '/package-docs/'), { replace: true })
2233
}
2334

2435
// /org/* → /@*
2536
if (path.startsWith('/org/')) {
2637
return navigateTo(path.replace('/org/', '/@'), { replace: true })
2738
}
39+
40+
// Keep this one last as it will catch everything
41+
// /* → /package/* (Unless its an existing page)
42+
if (path.startsWith('/') && !path.startsWith('/package/')) {
43+
const router = useRouter()
44+
const resolved = router.resolve(path)
45+
if (resolved?.matched?.length === 1 && resolved.matched[0]?.path === '/:package(.*)*') {
46+
return navigateTo(`/package${path}`, { replace: true })
47+
}
48+
}
2849
})
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { formatBytes } from '~/utils/formatters'
88
99
definePageMeta({
1010
name: 'code',
11-
alias: ['/package/code/:path(.*)*'],
11+
alias: ['/package/code/:path(.*)*', '/code/:path(.*)*'],
1212
})
1313
1414
const route = useRoute('code')
@@ -49,7 +49,7 @@ const { data: pkg } = usePackage(packageName)
4949
5050
// URL pattern for version selector - includes file path if present
5151
const versionUrlPattern = computed(() => {
52-
const base = `/code/${packageName.value}/v/{version}`
52+
const base = `/package-code/${packageName.value}/v/{version}`
5353
return filePath.value ? `${base}/${filePath.value}` : base
5454
})
5555
@@ -183,7 +183,7 @@ const breadcrumbs = computed(() => {
183183
184184
// Navigation helper - build URL for a path
185185
function getCodeUrl(path?: string): string {
186-
const base = `/code/${packageName.value}/v/${version.value}`
186+
const base = `/package-code/${packageName.value}/v/${version.value}`
187187
return path ? `${base}/${path}` : base
188188
}
189189
@@ -238,7 +238,7 @@ function copyPermalinkUrl() {
238238
239239
// Canonical URL for this code page
240240
const canonicalUrl = computed(() => {
241-
let url = `https://npmx.dev/code/${packageName.value}/v/${version.value}`
241+
let url = `https://npmx.dev/package-code/${packageName.value}/v/${version.value}`
242242
if (filePath.value) {
243243
url += `/${filePath.value}`
244244
}
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { assertValidPackageName } from '#shared/utils/npm'
55
66
definePageMeta({
77
name: 'docs',
8+
alias: ['/package/docs/:path(.*)*', '/docs/:path(.*)*'],
89
})
910
1011
const route = useRoute('docs')
@@ -46,7 +47,7 @@ if (import.meta.server && !requestedVersion.value) {
4647
if (latest) {
4748
setResponseHeader(useRequestEvent()!, 'Cache-Control', 'no-cache')
4849
app.runWithContext(() =>
49-
navigateTo('/docs/' + packageName.value + '/v/' + latest, { redirectCode: 302 }),
50+
navigateTo('/package-docs/' + packageName.value + '/v/' + latest, { redirectCode: 302 }),
5051
)
5152
}
5253
}
@@ -55,7 +56,7 @@ watch(
5556
[requestedVersion, latestVersion, packageName],
5657
([version, latest, name]) => {
5758
if (!version && latest && name) {
58-
router.replace(`/docs/${name}/v/${latest}`)
59+
router.replace(`/package-docs/${name}/v/${latest}`)
5960
}
6061
},
6162
{ immediate: true },
@@ -121,7 +122,7 @@ const showEmptyState = computed(() => docsData.value?.status !== 'ok')
121122
<div class="flex items-center gap-3 min-w-0">
122123
<NuxtLink
123124
v-if="packageName"
124-
:to="`/${packageName}`"
125+
:to="{ name: 'package', params: { package: [packageName] } }"
125126
class="font-mono text-lg sm:text-xl font-semibold text-fg hover:text-fg-muted transition-colors truncate"
126127
>
127128
{{ packageName }}
@@ -132,7 +133,7 @@ const showEmptyState = computed(() => docsData.value?.status !== 'ok')
132133
:current-version="resolvedVersion"
133134
:versions="pkg.versions"
134135
:dist-tags="pkg['dist-tags']"
135-
:url-pattern="`/docs/${packageName}/v/{version}`"
136+
:url-pattern="`/package-docs/${packageName}/v/{version}`"
136137
/>
137138
<span v-else-if="resolvedVersion" class="text-fg-subtle font-mono text-sm shrink-0">
138139
{{ resolvedVersion }}
@@ -180,7 +181,7 @@ const showEmptyState = computed(() => docsData.value?.status !== 'ok')
180181
<div class="flex gap-4 mt-4">
181182
<NuxtLink
182183
v-if="packageName"
183-
:to="`/${packageName}`"
184+
:to="{ name: 'package', params: { package: [packageName] } }"
184185
class="link-subtle font-mono text-sm"
185186
>
186187
View package
Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { formatBytes } from '~/utils/formatters'
1414
1515
definePageMeta({
1616
name: 'package',
17-
alias: ['/package/:package(.*)*'],
17+
alias: ['/:package(.*)*'],
1818
})
1919
2020
const router = useRouter()
@@ -344,7 +344,7 @@ const createPackageInfo = computed(() => {
344344
345345
// Canonical URL for this package page
346346
const canonicalUrl = computed(() => {
347-
const base = `https://npmx.dev/${packageName.value}`
347+
const base = `https://npmx.dev/package/${packageName.value}`
348348
return requestedVersion.value ? `${base}/v/${requestedVersion.value}` : base
349349
})
350350
@@ -466,7 +466,7 @@ function handleClick(event: MouseEvent) {
466466

467467
<NuxtLink
468468
v-if="resolvedVersion !== requestedVersion"
469-
:to="`/${pkg.name}/v/${displayVersion.version}`"
469+
:to="`/package/${pkg.name}/v/${displayVersion.version}`"
470470
:title="$t('package.view_permalink')"
471471
>{{ displayVersion.version }}</NuxtLink
472472
>
@@ -990,9 +990,14 @@ function handleClick(event: MouseEvent) {
990990
<Readme v-if="readmeData?.html" :html="readmeData.html" @click="handleClick" />
991991
<p v-else class="text-fg-subtle italic">
992992
{{ $t('package.readme.no_readme') }}
993-
<a v-if="repositoryUrl" :href="repositoryUrl" rel="noopener noreferrer" class="link">{{
994-
$t('package.readme.view_on_github')
995-
}}</a>
993+
<a
994+
v-if="repositoryUrl"
995+
:href="repositoryUrl"
996+
target="_blank"
997+
rel="noopener noreferrer"
998+
class="link"
999+
>{{ $t('package.readme.view_on_github') }}</a
1000+
>
9961001
</p>
9971002
</section>
9981003

0 commit comments

Comments
 (0)