forked from
npmx.dev/npmx.dev
[READ-ONLY]
a fast, modern browser for the npm registry
1import { isError, createError } from 'h3'
2import * as v from 'valibot'
3import type { ErrorOptions } from '#shared/types/error'
4
5/**
6 * Generic error handler for Nitro routes
7 * Handles H3 errors, Valibot, and fallbacks in that order
8 */
9export function handleApiError(error: unknown, fallback: ErrorOptions): never {
10 // If already a known Nuxt/H3 Error, apply fallback only when the error has a generic 500 status
11 if (isError(error)) {
12 if (error.statusCode === 500 && fallback.statusCode) {
13 error.statusCode = fallback.statusCode
14 }
15 if (error.statusMessage === 'Server Error' && fallback.statusMessage) {
16 error.statusMessage = fallback.statusMessage
17 }
18 throw error
19 }
20
21 // Handle Valibot validation errors
22 if (v.isValiError(error)) {
23 throw createError({
24 // TODO: throwing 404 rather than 400 as it's cacheable
25 statusCode: 404,
26 message: error.issues[0].message,
27 })
28 }
29
30 // Generic fallback
31 throw createError({
32 statusCode: fallback.statusCode ?? 502,
33 statusMessage: fallback.statusMessage,
34 message: fallback.message,
35 })
36}