mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-16 19:04:48 +00:00
66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
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<DataT = unknown> extends H3Error<DataT> {}
|
|
|
|
export const showError = <DataT = unknown>(
|
|
error: string | Error | Partial<NuxtError<DataT>>
|
|
) => {
|
|
const nuxtError = createError<DataT>(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 = <DataT = unknown>(
|
|
error?: string | object
|
|
): error is NuxtError<DataT> => (
|
|
!!error && typeof error === 'object' && NUXT_ERROR_SIGNATURE in error
|
|
)
|
|
|
|
export const createError = <DataT = unknown>(
|
|
error: string | Partial<NuxtError<DataT>>
|
|
) => {
|
|
const nuxtError: NuxtError<DataT> = createH3Error<DataT>(error)
|
|
|
|
Object.defineProperty(nuxtError, NUXT_ERROR_SIGNATURE, {
|
|
value: true,
|
|
configurable: false,
|
|
writable: false
|
|
})
|
|
|
|
return nuxtError
|
|
}
|