diff options
-rw-r--r-- | .changeset/breezy-plums-clap.md | 5 | ||||
-rw-r--r-- | packages/astro/src/core/errors/dev/vite.ts | 2 | ||||
-rw-r--r-- | packages/astro/src/core/module-loader/vite.ts | 21 |
3 files changed, 28 insertions, 0 deletions
diff --git a/.changeset/breezy-plums-clap.md b/.changeset/breezy-plums-clap.md new file mode 100644 index 000000000..d6d3f4b26 --- /dev/null +++ b/.changeset/breezy-plums-clap.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes a case where the error overlay would not escape the message diff --git a/packages/astro/src/core/errors/dev/vite.ts b/packages/astro/src/core/errors/dev/vite.ts index 56688877a..9063e45b7 100644 --- a/packages/astro/src/core/errors/dev/vite.ts +++ b/packages/astro/src/core/errors/dev/vite.ts @@ -105,6 +105,7 @@ export function enhanceViteSSRError({ } export interface AstroErrorPayload { + __isEnhancedAstroErrorPayload: true; type: ErrorPayload['type']; err: Omit<ErrorPayload['err'], 'loc'> & { name?: string; @@ -164,6 +165,7 @@ export async function getViteErrorPayload(err: ErrorWithMetadata): Promise<Astro : undefined; return { + __isEnhancedAstroErrorPayload: true, type: 'error', err: { ...err, diff --git a/packages/astro/src/core/module-loader/vite.ts b/packages/astro/src/core/module-loader/vite.ts index 1b2a4423c..20aea87e2 100644 --- a/packages/astro/src/core/module-loader/vite.ts +++ b/packages/astro/src/core/module-loader/vite.ts @@ -1,6 +1,9 @@ import { EventEmitter } from 'node:events'; import path from 'node:path'; +import { pathToFileURL } from 'node:url'; import type * as vite from 'vite'; +import { collectErrorMetadata } from '../errors/dev/utils.js'; +import { getViteErrorPayload } from '../errors/dev/vite.js'; import type { ModuleLoader, ModuleLoaderEventEmitter } from './loader.js'; export function createViteLoader(viteServer: vite.ViteDevServer): ModuleLoader { @@ -43,6 +46,24 @@ export function createViteLoader(viteServer: vite.ViteDevServer): ModuleLoader { } const msg = args[0] as vite.HMRPayload; if (msg?.type === 'error') { + // If we have an error, but it didn't go through our error enhancement program, it means that it's a HMR error from + // vite itself, which goes through a different path. We need to enhance it here. + if (!(msg as any)['__isEnhancedAstroErrorPayload']) { + const err = collectErrorMetadata(msg.err, pathToFileURL(viteServer.config.root)); + getViteErrorPayload(err).then((payload) => { + events.emit('hmr-error', { + type: 'error', + err: { + message: payload.err.message, + stack: payload.err.stack, + }, + }); + + args[0] = payload; + _wsSend.apply(this, args); + }); + return; + } events.emit('hmr-error', msg); } _wsSend.apply(this, args); |