From 037e0ad2f21d8a325be9e4aa4b5156003bd754ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20G=C5=82owala?= Date: Tue, 23 Jan 2024 17:29:53 +0100 Subject: [PATCH 1/8] refactor: replace Nuxt payload's error type with `NuxtError` --- packages/nuxt/src/app/entry.ts | 13 +++++++------ packages/nuxt/src/app/nuxt.ts | 9 +-------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/nuxt/src/app/entry.ts b/packages/nuxt/src/app/entry.ts index dd4f4ab97a72..3e20f80b3403 100644 --- a/packages/nuxt/src/app/entry.ts +++ b/packages/nuxt/src/app/entry.ts @@ -17,6 +17,7 @@ import plugins from '#build/plugins' import RootComponent from '#build/root-component.mjs' // @ts-expect-error virtual file import { vueAppRootContainer } from '#build/nuxt.config.mjs' +import { createError } from '#app' let entry: (ssrContext?: CreateOptions['ssrContext']) => Promise> @@ -29,9 +30,9 @@ if (import.meta.server) { try { await applyPlugins(nuxt, plugins) await nuxt.hooks.callHook('app:created', vueApp) - } catch (err) { - await nuxt.hooks.callHook('app:error', err) - nuxt.payload.error = (nuxt.payload.error || err) as any + } catch (error) { + await nuxt.hooks.callHook('app:error', error) + nuxt.payload.error = nuxt.payload.error || createError(error as any) } if (ssrContext?._renderResponse) { throw new Error('skipping render') } @@ -59,9 +60,9 @@ if (import.meta.client) { const nuxt = createNuxtApp({ vueApp }) - async function handleVueError(err: any) { - await nuxt.callHook('app:error', err) - nuxt.payload.error = (nuxt.payload.error || err) as any + async function handleVueError(error: any) { + await nuxt.callHook('app:error', error) + nuxt.payload.error = nuxt.payload.error || createError(error as any) } vueApp.config.errorHandler = handleVueError diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index ba82373afb78..5a6dac2fa35c 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -84,14 +84,7 @@ export interface NuxtPayload { state: Record once: Set config?: Pick - error?: Error | { - url: string - statusCode: number - statusMessage: string - message: string - description: string - data?: any - } | null + error?: NuxtError | null _errors: Record [key: string]: unknown } From dda7c3721818ebaf785d1cb55c368f1203cba9dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20G=C5=82owala?= Date: Tue, 23 Jan 2024 17:38:14 +0100 Subject: [PATCH 2/8] refactor: update `createError` import --- packages/nuxt/src/app/entry.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/nuxt/src/app/entry.ts b/packages/nuxt/src/app/entry.ts index 3e20f80b3403..72d889fb2c53 100644 --- a/packages/nuxt/src/app/entry.ts +++ b/packages/nuxt/src/app/entry.ts @@ -10,6 +10,8 @@ import '#build/fetch.mjs' import { applyPlugins, createNuxtApp } from './nuxt' import type { CreateOptions } from './nuxt' +import { createError } from './composables/error' + import '#build/css' // @ts-expect-error virtual file import plugins from '#build/plugins' @@ -17,7 +19,6 @@ import plugins from '#build/plugins' import RootComponent from '#build/root-component.mjs' // @ts-expect-error virtual file import { vueAppRootContainer } from '#build/nuxt.config.mjs' -import { createError } from '#app' let entry: (ssrContext?: CreateOptions['ssrContext']) => Promise> From 49c92f2b261418063ceed381fef64aef8b0ec90e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20G=C5=82owala?= Date: Tue, 23 Jan 2024 18:01:16 +0100 Subject: [PATCH 3/8] fix: do not exclude `Error` in nitro renderer --- packages/nuxt/src/core/runtime/nitro/renderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index 964f76272ca8..c69c7167b856 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -235,7 +235,7 @@ export default defineRenderHandler(async (event): Promise + ? getQuery(event) as unknown as NuxtPayload['error'] : null if (ssrError && ssrError.statusCode) { From 1dcb99307d838af204a7b35e4b838a3fcad4eb1a Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 23 Jan 2024 17:09:51 +0000 Subject: [PATCH 4/8] fix(nuxt): manually specify 'url' as an internal property --- packages/nuxt/src/core/runtime/nitro/error.ts | 3 ++- packages/nuxt/src/core/runtime/nitro/renderer.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/nuxt/src/core/runtime/nitro/error.ts b/packages/nuxt/src/core/runtime/nitro/error.ts index 8b2aa16cefbb..c58bb75fcddc 100644 --- a/packages/nuxt/src/core/runtime/nitro/error.ts +++ b/packages/nuxt/src/core/runtime/nitro/error.ts @@ -5,6 +5,7 @@ import { getRequestHeaders, send, setResponseHeader, setResponseStatus } from 'h import { useRuntimeConfig } from '#internal/nitro' import { useNitroApp } from '#internal/nitro/app' import { isJsonRequest, normalizeError } from '#internal/nitro/utils' +import type { NuxtPayload } from '#app' export default async function errorhandler (error: H3Error, event) { // Parse and normalize error @@ -21,7 +22,7 @@ export default async function errorhandler (error: H3Error, : '', // TODO: check and validate error.data for serialisation into query data: error.data as any - } + } satisfies Partial & { url: string } // Console output if (error.unhandled || error.fatal) { diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index c69c7167b856..8c63667db6c6 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -235,7 +235,7 @@ export default defineRenderHandler(async (event): Promise Date: Thu, 25 Jan 2024 17:03:43 +0100 Subject: [PATCH 5/8] docs: update `error.vue` code examples --- docs/1.getting-started/8.error-handling.md | 4 +++- docs/2.guide/2.directory-structure/3.error.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/1.getting-started/8.error-handling.md b/docs/1.getting-started/8.error-handling.md index b6067c659371..c5d61f96693c 100644 --- a/docs/1.getting-started/8.error-handling.md +++ b/docs/1.getting-started/8.error-handling.md @@ -86,8 +86,10 @@ Customize the default error page by adding `~/error.vue` in the source directory ```vue [error.vue] From c8489da5ff45504c07977786914575907de30b20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20G=C5=82owala?= Date: Thu, 25 Jan 2024 17:14:51 +0100 Subject: [PATCH 6/8] docs: update `NuxtError` fields --- docs/2.guide/2.directory-structure/3.error.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/2.guide/2.directory-structure/3.error.md b/docs/2.guide/2.directory-structure/3.error.md index de3acc8efc9f..e52edb59c63f 100644 --- a/docs/2.guide/2.directory-structure/3.error.md +++ b/docs/2.guide/2.directory-structure/3.error.md @@ -33,12 +33,12 @@ The error page has a single prop - `error` which contains an error for you to ha The `error` object provides the following fields: ```ts { - url: string statusCode: number - statusMessage: string - message: string - description: string - data: any + fatal: boolean + unhandled: boolean + statusMessage?: string + data?: unknown + cause?: unknown } ``` From 7d1ba8bf11c9dc59e9fbc77e72da3e0d6b16aa25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20G=C5=82owala?= Date: Sun, 28 Jan 2024 15:54:55 +0100 Subject: [PATCH 7/8] Update 8.error-handling.md --- docs/1.getting-started/8.error-handling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/1.getting-started/8.error-handling.md b/docs/1.getting-started/8.error-handling.md index c5d61f96693c..02cc9d1844ee 100644 --- a/docs/1.getting-started/8.error-handling.md +++ b/docs/1.getting-started/8.error-handling.md @@ -89,7 +89,7 @@ Customize the default error page by adding `~/error.vue` in the source directory import type { NuxtError } from '#app' const props = defineProps({ - error: NuxtError + error: Object as () => NuxtError }) const handleError = () => clearError({ redirect: '/' }) From be2975947ea91f371fe737a525becbd18afc6861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20G=C5=82owala?= Date: Sun, 28 Jan 2024 15:55:17 +0100 Subject: [PATCH 8/8] Update 3.error.md --- docs/2.guide/2.directory-structure/3.error.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/2.guide/2.directory-structure/3.error.md b/docs/2.guide/2.directory-structure/3.error.md index 5084855ad5de..f05c7a7fe366 100644 --- a/docs/2.guide/2.directory-structure/3.error.md +++ b/docs/2.guide/2.directory-structure/3.error.md @@ -12,7 +12,7 @@ During the lifespan of your application, some errors may appear unexpectedly at import type { NuxtError } from '#app' const props = defineProps({ - error: NuxtError + error: Object as () => NuxtError })