From 353c467610e2d92c0929fa4abd03f2cbd26e34ed Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 27 Jan 2025 16:27:45 +0900 Subject: [PATCH] fix(ssr): pretty print plugin error in `ssrLoadModule` (#19290) --- .../node/ssr/__tests__/ssrLoadModule.spec.ts | 43 ++++++++++++++++++- packages/vite/src/node/ssr/ssrModuleLoader.ts | 5 ++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts index a4439aa726e5d7..f4011d76c95aee 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import path from 'node:path' import fs from 'node:fs' import { stripVTControlCharacters } from 'node:util' -import { expect, test } from 'vitest' +import { expect, onTestFinished, test, vi } from 'vitest' import { createServer } from '../../server' import { normalizePath } from '../../utils' @@ -251,3 +251,44 @@ test('file url', async () => { ) expect(modWithSpace.msg).toBe('works') }) + +test('plugin error', async () => { + const server = await createServer({ + configFile: false, + root, + logLevel: 'error', + plugins: [ + { + name: 'test-plugin', + resolveId(source) { + if (source === 'virtual:test') { + return '\0' + source + } + }, + load(id) { + if (id === '\0virtual:test') { + return this.error('test-error') + } + }, + }, + ], + }) + onTestFinished(() => server.close()) + + const spy = vi + .spyOn(server.config.logger, 'error') + .mockImplementation(() => {}) + try { + await server.ssrLoadModule('virtual:test') + expect.unreachable() + } catch {} + expect( + stripVTControlCharacters(spy.mock.lastCall![0]) + .split('\n') + .slice(0, 2) + .join('\n'), + ).toMatchInlineSnapshot(` + "Error when evaluating SSR module virtual:test: test-error + Plugin: test-plugin" + `) +}) diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index f707b93d6d77bf..6d431704446053 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -5,6 +5,7 @@ import type { ViteDevServer } from '../server' import { unwrapId } from '../../shared/utils' import type { DevEnvironment } from '../server/environment' import type { NormalizedServerHotChannel } from '../server/hmr' +import { buildErrorMessage } from '../server/middlewares/error' import { ssrFixStacktrace } from './ssrStacktrace' import { createServerModuleRunnerTransport } from './runtime/serverModuleRunner' @@ -47,7 +48,9 @@ async function instantiateModule( } environment.logger.error( - colors.red(`Error when evaluating SSR module ${url}:\n|- ${e.stack}\n`), + buildErrorMessage(e, [ + colors.red(`Error when evaluating SSR module ${url}: ${e.message}`), + ]), { timestamp: true, clear: environment.config.clearScreen,