import type { H3Error } from 'h3' import { createError as createH3Error } from 'h3' import { toRef } from 'vue' import { useNuxtApp } from '../nuxt' import { useRouter } from './router' export const NUXT_ERROR_SIGNATURE = '__nuxt_error' export const useError = () => toRef(useNuxtApp().payload, 'error') export interface NuxtError extends H3Error {} export const showError = ( error: string | Error | Partial> ) => { const nuxtError = createError(error) try { const nuxtApp = useNuxtApp() const error = useError() if (import.meta.client) { nuxtApp.hooks.callHook('app:error', nuxtError) } error.value = error.value || nuxtError } catch { throw nuxtError } return nuxtError } export const clearError = async (options: { redirect?: string } = {}) => { const nuxtApp = useNuxtApp() const error = useError() nuxtApp.callHook('app:error:cleared', options) if (options.redirect) { await useRouter().replace(options.redirect) } error.value = null } export const isNuxtError = ( error?: string | object ): error is NuxtError => ( !!error && typeof error === 'object' && NUXT_ERROR_SIGNATURE in error ) export const createError = ( error: string | Partial> ) => { const nuxtError: NuxtError = createH3Error(error) Object.defineProperty(nuxtError, NUXT_ERROR_SIGNATURE, { value: true, configurable: false, writable: false }) return nuxtError }