diff --git a/packages/utils/src/serialize.ts b/packages/utils/src/serialize.ts index 1a7b8ce1a..b822bca5e 100644 --- a/packages/utils/src/serialize.ts +++ b/packages/utils/src/serialize.ts @@ -120,7 +120,7 @@ export function serializeValue(val: any, seen: WeakMap = new WeakM obj = Object.getPrototypeOf(obj) } if (val instanceof Error) { - safe(() => val.message = normalizeErrorMessage(val.message)) + safe(() => clone.message = normalizeErrorMessage(val.message)) } return clone } @@ -136,5 +136,11 @@ function safe(fn: () => void) { } function normalizeErrorMessage(message: string) { - return message.replace(/__(vite_ssr_import|vi_import)_\d+__\./g, '') + return message + // vite 7+ + .replace(/\(0\s?,\s?__vite_ssr_import_\d+__.(\w+)\)/g, '$1') + // vite <7 + .replace(/__(vite_ssr_import|vi_import)_\d+__\./g, '') + // vitest-browser-* errors will have __vitest___ in their messages + .replace(/getByTestId('__vitest_\d+__')/g, 'page') } diff --git a/packages/utils/src/source-map.ts b/packages/utils/src/source-map.ts index 3c2fbd013..ba921a0d9 100644 --- a/packages/utils/src/source-map.ts +++ b/packages/utils/src/source-map.ts @@ -197,7 +197,10 @@ export function parseSingleV8Stack(raw: string): ParsedStack | null { if (method) { method = method - .replace(/__vite_ssr_import_\d+__\./g, '') + // vite 7+ + .replace(/\(0\s?,\s?__vite_ssr_import_\d+__.(\w+)\)/g, '$1') + // vite <7 + .replace(/__(vite_ssr_import|vi_import)_\d+__\./g, '') .replace(/(Object\.)?__vite_ssr_export_default__\s?/g, '') } diff --git a/packages/vitest/src/node/ast-collect.ts b/packages/vitest/src/node/ast-collect.ts index 8b29dd1e9..562dbab36 100644 --- a/packages/vitest/src/node/ast-collect.ts +++ b/packages/vitest/src/node/ast-collect.ts @@ -168,8 +168,10 @@ function astParseFile(filepath: string, code: string) { } message = message - // Vite SSR injects these - .replace(/__vite_ssr_import_\d+__\./g, '') + // vite 7+ + .replace(/\(0\s?,\s?__vite_ssr_import_\d+__.(\w+)\)/g, '$1') + // vite <7 + .replace(/__(vite_ssr_import|vi_import)_\d+__\./g, '') // Vitest module mocker injects these .replace(/__vi_import_\d+__\./g, '') diff --git a/test/cli/fixtures/fails/exports-error.test.js b/test/cli/fixtures/fails/exports-error.test.js new file mode 100644 index 000000000..6a0217bd9 --- /dev/null +++ b/test/cli/fixtures/fails/exports-error.test.js @@ -0,0 +1,6 @@ +import { test, vi } from 'vitest' + +test('__vite_ssr_import__ is removed in error', () => { + // vi is not a function + vi() +}) diff --git a/test/cli/test/__snapshots__/fails.test.ts.snap b/test/cli/test/__snapshots__/fails.test.ts.snap index fa1a7e84a..6afab023c 100644 --- a/test/cli/test/__snapshots__/fails.test.ts.snap +++ b/test/cli/test/__snapshots__/fails.test.ts.snap @@ -27,6 +27,8 @@ exports[`should fail expect-soft.test.ts 1`] = `"Error: expect.soft() can only b exports[`should fail expect-unreachable.test.ts 1`] = `"AssertionError: expected "hi" not to be reached"`; +exports[`should fail exports-error.test.js 1`] = `"TypeError: vi is not a function"`; + exports[`should fail hook-timeout.test.ts 1`] = `"Error: Hook timed out in 10ms."`; exports[`should fail hooks-called.test.ts 1`] = ` diff --git a/test/cli/test/fails.test.ts b/test/cli/test/fails.test.ts index b36cf1936..6c1eec073 100644 --- a/test/cli/test/fails.test.ts +++ b/test/cli/test/fails.test.ts @@ -7,7 +7,7 @@ import { expect, it } from 'vitest' import { runInlineTests, runVitest, ts } from '../../test-utils' const root = resolve(import.meta.dirname, '../fixtures/fails') -const files = await glob(['**/*.test.ts'], { cwd: root, dot: true, expandDirectories: false }) +const files = await glob(['**/*.test.{ts,js}'], { cwd: root, dot: true, expandDirectories: false }) it.each(files)('should fail %s', async (file) => { const { stderr } = await runVitest({ root }, [file])