diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 1f06627505a54d..5f7ab12765a169 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -48,7 +48,10 @@ import { TransformOptions as EsbuildTransformOptions } from 'esbuild' import { DepOptimizationMetadata, optimizeDeps } from '../optimizer' import { ssrLoadModule } from '../ssr/ssrModuleLoader' import { resolveSSRExternal } from '../ssr/ssrExternal' -import { ssrRewriteStacktrace } from '../ssr/ssrStacktrace' +import { + rebindErrorStacktrace, + ssrRewriteStacktrace +} from '../ssr/ssrStacktrace' import { createMissingImporterRegisterFn } from '../optimizer/registerMissing' import { printServerUrls } from '../logger' import { resolveHostname } from '../utils' @@ -366,7 +369,8 @@ export async function createServer( }, ssrFixStacktrace(e) { if (e.stack) { - e.stack = ssrRewriteStacktrace(e.stack, moduleGraph) + const stacktrace = ssrRewriteStacktrace(e.stack, moduleGraph) + rebindErrorStacktrace(e, stacktrace) } }, listen(port?: number, isRestart?: boolean) { diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index 3ee706740f3c60..b68b104461c0b3 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -2,7 +2,7 @@ import fs from 'fs' import path from 'path' import { ViteDevServer } from '..' import { cleanUrl, resolveFrom, unwrapId } from '../utils' -import { ssrRewriteStacktrace } from './ssrStacktrace' +import { rebindErrorStacktrace, ssrRewriteStacktrace } from './ssrStacktrace' import { ssrExportAllKey, ssrModuleExportsKey, @@ -141,9 +141,10 @@ async function instantiateModule( ssrExportAll ) } catch (e) { - e.stack = ssrRewriteStacktrace(e.stack, moduleGraph) + const stacktrace = ssrRewriteStacktrace(e.stack, moduleGraph) + rebindErrorStacktrace(e, stacktrace) server.config.logger.error( - `Error when evaluating SSR module ${url}:\n${e.stack}`, + `Error when evaluating SSR module ${url}:\n${stacktrace}`, { timestamp: true, clear: server.config.clearScreen diff --git a/packages/vite/src/node/ssr/ssrStacktrace.ts b/packages/vite/src/node/ssr/ssrStacktrace.ts index d20365f7106fd0..4dda7eb9eb175d 100644 --- a/packages/vite/src/node/ssr/ssrStacktrace.ts +++ b/packages/vite/src/node/ssr/ssrStacktrace.ts @@ -56,3 +56,20 @@ export function ssrRewriteStacktrace( }) .join('\n') } + +export function rebindErrorStacktrace(e: Error, stacktrace: string): void { + const { configurable, writable } = Object.getOwnPropertyDescriptor( + e, + 'stack' + )! + if (configurable) { + Object.defineProperty(e, 'stack', { + value: stacktrace, + enumerable: true, + configurable: true, + writable: true + }) + } else if (writable) { + e.stack = stacktrace + } +}