Skip to content

Commit 65b06e9

Browse files
committed
fix: throw early error for package 404s
1 parent b45acab commit 65b06e9

2 files changed

Lines changed: 29 additions & 21 deletions

File tree

app/error.vue

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,6 @@ const statusText = computed(() => {
2020
}
2121
})
2222
23-
// Sanitize error messages to hide internal details (e.g., HTTP methods, registry URLs)
24-
const sanitizedMessage = computed(() => {
25-
const msg = props.error.message
26-
if (!msg) return null
27-
28-
// Clean up messages that expose internal HTTP details like:
29-
// [GET] "https://registry.npmjs.org/...": 404 Not Found
30-
// Extract just the status part (e.g., "404 Not Found")
31-
const httpMatch = msg.match(/^\[(GET|POST|PUT|DELETE|PATCH)\]\s+"https?:\/\/[^"]+"\s*:\s*(.+)$/)
32-
if (httpMatch) {
33-
return httpMatch[2] // Return just "404 Not Found" part
34-
}
35-
36-
return msg
37-
})
38-
3923
function handleError() {
4024
clearError({ redirect: '/' })
4125
}
@@ -59,10 +43,10 @@ useHead({
5943
</h1>
6044

6145
<p
62-
v-if="sanitizedMessage && sanitizedMessage !== statusText"
46+
v-if="error.message && error.message !== statusText"
6347
class="text-fg-muted text-base max-w-md mb-8"
6448
>
65-
{{ sanitizedMessage }}
49+
{{ error.message }}
6650
</p>
6751

6852
<button

app/pages/package/[...package].vue

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,30 @@ const { data: skillsData } = useLazyFetch<SkillsListResponse>(
104104
const { data: packageAnalysis } = usePackageAnalysis(packageName, requestedVersion)
105105
const { data: moduleReplacement } = useModuleReplacement(packageName)
106106
107-
const { data: resolvedVersion } = await useResolvedVersion(packageName, requestedVersion)
107+
const {
108+
data: resolvedVersion,
109+
status: versionStatus,
110+
error: versionError,
111+
} = await useResolvedVersion(packageName, requestedVersion)
112+
113+
if (
114+
versionStatus.value === 'error' &&
115+
versionError.value?.statusCode &&
116+
versionError.value.statusCode >= 400 &&
117+
versionError.value.statusCode < 500
118+
) {
119+
throw createError({
120+
statusCode: 404,
121+
statusMessage: $t('package.not_found'),
122+
message: $t('package.not_found_message'),
123+
})
124+
}
108125
109-
const { data: pkg, status } = usePackage(packageName, resolvedVersion.value ?? requestedVersion)
126+
const {
127+
data: pkg,
128+
status,
129+
error,
130+
} = usePackage(packageName, resolvedVersion.value ?? requestedVersion)
110131
const displayVersion = computed(() => pkg.value?.requestedVersion ?? null)
111132
112133
// Process package description
@@ -1101,9 +1122,12 @@ defineOgImageComponent('Package', {
11011122
role="alert"
11021123
class="flex flex-col items-center py-20 text-center"
11031124
>
1104-
<h1 class="font-mono text-2xl font-medium mb-8">
1125+
<h1 class="font-mono text-2xl font-medium mb-4">
11051126
{{ $t('package.not_found') }}
11061127
</h1>
1128+
<p class="text-fg-muted mb-8">
1129+
{{ error?.message ?? $t('package.not_found_message') }}
1130+
</p>
11071131
<NuxtLink to="/" class="btn">{{ $t('common.go_back_home') }}</NuxtLink>
11081132
</div>
11091133
</main>

0 commit comments

Comments
 (0)