[READ-ONLY] a fast, modern browser for the npm registry
at main 36 lines 1.1 kB view raw
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}