(error: unknown, fallback: ErrorOptions)
| 8 | * Handles H3 errors, Valibot, and fallbacks in that order |
| 9 | */ |
| 10 | export function handleApiError(error: unknown, fallback: ErrorOptions): never { |
| 11 | // If already a known Nuxt/H3 Error, apply fallback only when the error has a generic 500 status |
| 12 | if (isError(error)) { |
| 13 | if (error.statusCode === 500 && fallback.statusCode) { |
| 14 | error.statusCode = fallback.statusCode |
| 15 | } |
| 16 | if (error.statusMessage === 'Server Error' && fallback.statusMessage) { |
| 17 | error.statusMessage = fallback.statusMessage |
| 18 | } |
| 19 | throw error |
| 20 | } |
| 21 | |
| 22 | if (error instanceof FetchError && error.statusCode) { |
| 23 | throw createError({ |
| 24 | statusCode: error.statusCode, |
| 25 | statusMessage: error.statusMessage, |
| 26 | message: error.message, |
| 27 | }) |
| 28 | } |
| 29 | |
| 30 | // Handle Valibot validation errors |
| 31 | if (v.isValiError(error)) { |
| 32 | throw createError({ |
| 33 | // TODO: throwing 404 rather than 400 as it's cacheable |
| 34 | statusCode: 404, |
| 35 | message: error.issues[0].message, |
| 36 | }) |
| 37 | } |
| 38 | |
| 39 | // Generic fallback |
| 40 | throw createError({ |
| 41 | statusCode: fallback.statusCode ?? 502, |
| 42 | statusMessage: fallback.statusMessage, |
| 43 | message: fallback.message, |
| 44 | }) |
| 45 | } |
no outgoing calls
no test coverage detected