diff --git a/packages/vite-node/README.md b/packages/vite-node/README.md index 4bcb5b5da00b..2bd2fa115ef3 100644 --- a/packages/vite-node/README.md +++ b/packages/vite-node/README.md @@ -56,6 +56,7 @@ In Vite Node, the server and runner (client) are separated, so you can integrate import { createServer } from 'vite' import { ViteNodeServer } from 'vite-node/server' import { ViteNodeRunner } from 'vite-node/client' +import { installSourcemapsSupport } from 'vite-node/source-map' // create vite server const server = await createServer({ @@ -70,6 +71,11 @@ await server.pluginContainer.buildStart({}) // create vite-node server const node = new ViteNodeServer(server) +// fixes stacktraces in Errors +installSourcemapsSupport({ + getSourceMap: source => node.getSourceMap(source), +}) + // create vite-node runner const runner = new ViteNodeRunner({ root: server.config.root, diff --git a/packages/vite-node/package.json b/packages/vite-node/package.json index cd2943cee05e..96ce0e85ba50 100644 --- a/packages/vite-node/package.json +++ b/packages/vite-node/package.json @@ -39,6 +39,11 @@ "types": "./dist/hmr.d.ts", "require": "./dist/hmr.cjs", "import": "./dist/hmr.mjs" + }, + "./source-map": { + "types": "./dist/source-map.d.ts", + "require": "./dist/source-map.cjs", + "import": "./dist/source-map.mjs" } }, "main": "./dist/index.mjs", @@ -73,10 +78,12 @@ "debug": "^4.3.4", "mlly": "^0.5.16", "pathe": "^0.2.0", + "source-map-support": "^0.5.21", "vite": "^3.0.0" }, "devDependencies": { "@types/debug": "^4.1.7", + "@types/source-map-support": "^0.5.6", "cac": "^6.7.14", "picocolors": "^1.0.0", "rollup": "^2.79.1" diff --git a/packages/vite-node/rollup.config.js b/packages/vite-node/rollup.config.js index 8f1e22adc04e..37c8e2ad8d0f 100644 --- a/packages/vite-node/rollup.config.js +++ b/packages/vite-node/rollup.config.js @@ -9,13 +9,14 @@ import { defineConfig } from 'rollup' import pkg from './package.json' const entries = { - index: 'src/index.ts', - server: 'src/server.ts', - types: 'src/types.ts', - client: 'src/client.ts', - utils: 'src/utils.ts', - cli: 'src/cli.ts', - hmr: 'src/hmr/index.ts', + 'index': 'src/index.ts', + 'server': 'src/server.ts', + 'types': 'src/types.ts', + 'client': 'src/client.ts', + 'utils': 'src/utils.ts', + 'cli': 'src/cli.ts', + 'hmr': 'src/hmr/index.ts', + 'source-map': 'src/source-map.ts', } const external = [ diff --git a/packages/vite-node/src/cli.ts b/packages/vite-node/src/cli.ts index e75ae1588ccd..602848d0c86e 100644 --- a/packages/vite-node/src/cli.ts +++ b/packages/vite-node/src/cli.ts @@ -7,6 +7,7 @@ import { ViteNodeRunner } from './client' import type { ViteNodeServerOptions } from './types' import { toArray } from './utils' import { createHotContext, handleMessage, viteNodeHmrPlugin } from './hmr' +import { installSourcemapsSupport } from './source-map' const cli = cac('vite-node') @@ -58,6 +59,10 @@ async function run(files: string[], options: CliOptions = {}) { const node = new ViteNodeServer(server, serverOptions) + installSourcemapsSupport({ + getSourceMap: source => node.getSourceMap(source), + }) + const runner = new ViteNodeRunner({ root: server.config.root, base: server.config.base, diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index b9456f7da684..998464fc2028 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -109,6 +109,23 @@ export class ModuleCacheMap extends Map { } return invalidated } + + /** + * Return parsed source map based on inlined source map of the module + */ + getSourceMap(id: string) { + const fsPath = this.normalizePath(id) + const cache = this.get(fsPath) + if (cache.map) + return cache.map + const mapString = cache?.code?.match(/\/\/# sourceMappingURL=data:application\/json;charset=utf-8;base64,(.+)/)?.[1] + if (mapString) { + const map = JSON.parse(Buffer.from(mapString, 'base64').toString('utf-8')) + cache.map = map + return map + } + return null + } } export class ViteNodeRunner { @@ -136,6 +153,10 @@ export class ViteNodeRunner { return await this.cachedRequest(id, []) } + getSourceMap(id: string) { + return this.moduleCache.getSourceMap(id) + } + /** @internal */ async cachedRequest(rawId: string, callstack: string[]) { const id = normalizeRequestId(rawId, this.options.base) @@ -293,7 +314,7 @@ export class ViteNodeRunner { // Be careful when changing this // changing context will change amount of code added on line :114 (vm.runInThisContext) // this messes up sourcemaps for coverage - // adjust `offset` variable in packages/vitest/src/integrations/coverage/c8.ts#86 if you do change this + // adjust `offset` variable in packages/coverage-c8/src/provider.ts#86 if you do change this const context = this.prepareContext({ // esm transformed by Vite __vite_ssr_import__: request, @@ -318,9 +339,12 @@ export class ViteNodeRunner { transformed = transformed.replace(/^\#\!.*/, s => ' '.repeat(s.length)) // add 'use strict' since ESM enables it by default - const fn = vm.runInThisContext(`'use strict';async (${Object.keys(context).join(',')})=>{{${transformed}\n}}`, { + const codeDefinition = `'use strict';async (${Object.keys(context).join(',')})=>{{` + const code = `${codeDefinition}${transformed}\n}}` + const fn = vm.runInThisContext(code, { filename: fsPath, lineOffset: 0, + columnOffset: -codeDefinition.length, }) await fn(...Object.values(context)) diff --git a/packages/vite-node/src/server.ts b/packages/vite-node/src/server.ts index 2302b31726e7..66654be63d92 100644 --- a/packages/vite-node/src/server.ts +++ b/packages/vite-node/src/server.ts @@ -73,6 +73,14 @@ export class ViteNodeServer { return this.server.pluginContainer.resolveId(id, importer, { ssr: mode === 'ssr' }) } + getSourceMap(source: string) { + const fetchResult = this.fetchCache.get(source)?.result + if (fetchResult?.map) + return fetchResult.map + const ssrTransformResult = this.server.moduleGraph.getModuleById(source)?.ssrTransformResult + return (ssrTransformResult?.map || null) as unknown as RawSourceMap | null + } + async fetchModule(id: string): Promise { // reuse transform for concurrent requests if (!this.fetchPromiseMap.has(id)) { diff --git a/packages/vite-node/src/source-map.ts b/packages/vite-node/src/source-map.ts new file mode 100644 index 000000000000..d862544d38cd --- /dev/null +++ b/packages/vite-node/src/source-map.ts @@ -0,0 +1,23 @@ +import { install } from 'source-map-support' +import type { RawSourceMap } from './types' + +interface InstallSourceMapSupportOptions { + getSourceMap: (source: string) => RawSourceMap | null | undefined +} + +export function installSourcemapsSupport(options: InstallSourceMapSupportOptions) { + install({ + environment: 'node', + handleUncaughtExceptions: false, + retrieveSourceMap(source) { + const map = options.getSourceMap(source) + if (map) { + return { + url: source, + map, + } + } + return null + }, + }) +} diff --git a/packages/vite-node/src/types.ts b/packages/vite-node/src/types.ts index b6581a641786..c94cfcfd75a9 100644 --- a/packages/vite-node/src/types.ts +++ b/packages/vite-node/src/types.ts @@ -45,6 +45,7 @@ export interface ModuleCache { promise?: Promise exports?: any code?: string + map?: RawSourceMap /** * Module ids that imports this module */ diff --git a/packages/vitest/LICENSE.md b/packages/vitest/LICENSE.md index 86747084cd3c..e3fc4e6dab15 100644 --- a/packages/vitest/LICENSE.md +++ b/packages/vitest/LICENSE.md @@ -335,6 +335,34 @@ Repository: micromatch/braces --------------------------------------- +## buffer-from +License: MIT +Repository: LinusU/buffer-from + +> MIT License +> +> Copyright (c) 2016, 2018 Linus Unnebäck +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + ## cac License: MIT By: egoist @@ -1806,10 +1834,10 @@ Repository: chalk/slice-ansi --------------------------------------- -## source-map-js +## source-map License: BSD-3-Clause -By: Valentin 7rulnik Semirulnik, Nick Fitzgerald, Tobias Koppers, Duncan Beevers, Stephen Crane, Ryan Seddon, Miles Elam, Mihai Bazon, Michael Ficarra, Todd Wolfson, Alexander Solovyov, Felix Gnass, Conrad Irwin, usrbincc, David Glasser, Chase Douglas, Evan Wallace, Heather Arthur, Hugh Kennedy, Simon Lydell, Jmeas Smith, Michael Z Goddard, azu, John Gozde, Adam Kirkton, Chris Montgomery, J. Ryan Stinnett, Jack Herrington, Chris Truter, Daniel Espeset, Jamie Wong, Eddy Bruël, Hawken Rives, Gilad Peleg, djchie, Gary Ye, Nicolas Lalevée -Repository: 7rulnik/source-map-js +By: Nick Fitzgerald, Tobias Koppers, Duncan Beevers, Stephen Crane, Ryan Seddon, Miles Elam, Mihai Bazon, Michael Ficarra, Todd Wolfson, Alexander Solovyov, Felix Gnass, Conrad Irwin, usrbincc, David Glasser, Chase Douglas, Evan Wallace, Heather Arthur, Hugh Kennedy, Simon Lydell, Jmeas Smith, Michael Z Goddard, azu, John Gozde, Adam Kirkton, Chris Montgomery, J. Ryan Stinnett, Jack Herrington, Chris Truter, Daniel Espeset, Jamie Wong, Eddy Bruël, Hawken Rives, Gilad Peleg, djchie, Gary Ye, Nicolas Lalevée +Repository: http://github.com/mozilla/source-map.git > Copyright (c) 2009-2011, Mozilla Foundation and contributors > All rights reserved. @@ -1841,6 +1869,34 @@ Repository: 7rulnik/source-map-js --------------------------------------- +## source-map-support +License: MIT +Repository: https://github.com/evanw/node-source-map-support + +> The MIT License (MIT) +> +> Copyright (c) 2014 Evan Wallace +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +--------------------------------------- + ## sourcemap-codec License: MIT By: Rich Harris diff --git a/packages/vitest/package.json b/packages/vitest/package.json index 17a8308e3378..60ec532fcc7d 100644 --- a/packages/vitest/package.json +++ b/packages/vitest/package.json @@ -152,7 +152,6 @@ "pretty-format": "^27.5.1", "prompts": "^2.4.2", "rollup": "^2.79.1", - "source-map-js": "^1.0.2", "strip-ansi": "^7.0.1", "typescript": "^4.8.4", "vite-node": "workspace:*", diff --git a/packages/vitest/src/api/setup.ts b/packages/vitest/src/api/setup.ts index eca3a1be9212..905bbf3c244c 100644 --- a/packages/vitest/src/api/setup.ts +++ b/packages/vitest/src/api/setup.ts @@ -8,7 +8,6 @@ import type { ModuleNode } from 'vite' import { API_PATH } from '../constants' import type { Vitest } from '../node' import type { File, ModuleGraphData, Reporter, TaskResultPack, UserConsoleLog } from '../types' -import { interpretSourcePos, parseStacktrace } from '../utils/source-map' import type { TransformResultWithSource, WebSocketEvents, WebSocketHandlers } from './types' export function setup(ctx: Vitest) { @@ -154,11 +153,6 @@ class WebSocketReporter implements Reporter { if (this.clients.size === 0) return - await Promise.all(packs.map(async (i) => { - if (i[1]?.error) - await interpretSourcePos(parseStacktrace(i[1].error as any), this.ctx) - })) - this.clients.forEach((client) => { client.onTaskUpdate?.(packs) }) diff --git a/packages/vitest/src/integrations/snapshot/port/inlineSnapshot.ts b/packages/vitest/src/integrations/snapshot/port/inlineSnapshot.ts index 1480c7030912..87f096233812 100644 --- a/packages/vitest/src/integrations/snapshot/port/inlineSnapshot.ts +++ b/packages/vitest/src/integrations/snapshot/port/inlineSnapshot.ts @@ -1,7 +1,6 @@ import { promises as fs } from 'fs' import type MagicString from 'magic-string' -import { rpc } from '../../../runtime/rpc' -import { getOriginalPos, lineSplitRE, numberToPos, posToNumber } from '../../../utils/source-map' +import { lineSplitRE, numberToPos, posToNumber } from '../../../utils/source-map' import { getCallLastIndex } from '../../../utils' export interface InlineSnapshot { @@ -17,14 +16,12 @@ export async function saveInlineSnapshots( const MagicString = (await import('magic-string')).default const files = new Set(snapshots.map(i => i.file)) await Promise.all(Array.from(files).map(async (file) => { - const map = await rpc().getSourceMap(file) const snaps = snapshots.filter(i => i.file === file) const code = await fs.readFile(file, 'utf8') const s = new MagicString(code) for (const snap of snaps) { - const pos = await getOriginalPos(map, snap) - const index = posToNumber(code, pos!) + const index = posToNumber(code, snap) replaceInlineSnap(code, s, index, snap.snapshot) } diff --git a/packages/vitest/src/node/error.ts b/packages/vitest/src/node/error.ts index 0746af6f2b2f..1e5836298025 100644 --- a/packages/vitest/src/node/error.ts +++ b/packages/vitest/src/node/error.ts @@ -4,7 +4,7 @@ import { join, normalize, relative } from 'pathe' import c from 'picocolors' import cliTruncate from 'cli-truncate' import type { ErrorWithDiff, ParsedStack, Position } from '../types' -import { interpretSourcePos, lineSplitRE, parseStacktrace, posToNumber } from '../utils/source-map' +import { lineSplitRE, parseStacktrace, posToNumber } from '../utils/source-map' import { F_POINTER } from '../utils/figures' import { stringify } from '../integrations/chai/jest-matcher-utils' import type { Vitest } from './core' @@ -45,8 +45,6 @@ export async function printError(error: unknown, ctx: Vitest, options: PrintErro const stacks = parseStacktrace(e, fullStack) - await interpretSourcePos(stacks, ctx) - const nearest = stacks.find(stack => ctx.server.moduleGraph.getModuleById(stack.file) && existsSync(stack.file), diff --git a/packages/vitest/src/node/reporters/json.ts b/packages/vitest/src/node/reporters/json.ts index 2a60d800401a..bd5d8318dcbf 100644 --- a/packages/vitest/src/node/reporters/json.ts +++ b/packages/vitest/src/node/reporters/json.ts @@ -4,7 +4,7 @@ import type { Vitest } from '../../node' import type { File, Reporter, Suite, Task, TaskState } from '../../types' import { getSuites, getTests } from '../../utils' import { getOutputFile } from '../../utils/config-helpers' -import { interpretSourcePos, parseStacktrace } from '../../utils/source-map' +import { parseStacktrace } from '../../utils/source-map' // for compatibility reasons, the reporter produces a JSON similar to the one produced by the Jest JSON reporter // the following types are extracted from the Jest repository (and simplified) @@ -186,7 +186,6 @@ export class JsonReporter implements Reporter { return const stack = parseStacktrace(error) - await interpretSourcePos(stack, this.ctx) const frame = stack[stack.length - 1] if (!frame) return diff --git a/packages/vitest/src/runtime/setup.ts b/packages/vitest/src/runtime/setup.ts index c86501828557..2497b62fb46b 100644 --- a/packages/vitest/src/runtime/setup.ts +++ b/packages/vitest/src/runtime/setup.ts @@ -1,3 +1,4 @@ +import { installSourcemapsSupport } from 'vite-node/source-map' import { environments } from '../integrations/env' import type { Environment, ResolvedConfig } from '../types' import { clearTimeout, getWorkerState, isNode, setTimeout, toArray } from '../utils' @@ -15,9 +16,6 @@ export async function setupGlobalEnv(config: ResolvedConfig) { enumerable: false, }) - // it's useful to see the full stack trace in the console by default - Error.stackTraceLimit = 100 - // should be re-declared for each test // if run with "threads: false" setupDefines(config.defines) @@ -27,8 +25,15 @@ export async function setupGlobalEnv(config: ResolvedConfig) { globalSetup = true - if (isNode) + if (isNode) { + const state = getWorkerState() + + installSourcemapsSupport({ + getSourceMap: source => state.moduleCache.getSourceMap(source), + }) + await setupConsoleLogSpy() + } if (config.globals) (await import('../integrations/globals')).registerApiGlobally() diff --git a/packages/vitest/src/utils/source-map.ts b/packages/vitest/src/utils/source-map.ts index b5ed47277d8e..7e0afe9d0c33 100644 --- a/packages/vitest/src/utils/source-map.ts +++ b/packages/vitest/src/utils/source-map.ts @@ -1,46 +1,12 @@ -import { SourceMapConsumer } from 'source-map-js' -import type { RawSourceMap } from 'vite-node' import type { ErrorWithDiff, ParsedStack, Position } from '../types' -import type { Vitest } from '../node' import { notNullish, slash } from './base' export const lineSplitRE = /\r?\n/ -export function getOriginalPos(map: RawSourceMap | null | undefined, { line, column }: Position): Promise { - return new Promise((resolve) => { - if (!map) - return resolve(null) - - const consumer = new SourceMapConsumer(map) - const pos = consumer.originalPositionFor({ line, column }) - if (pos.line != null && pos.column != null) - resolve(pos as Position) - - else - resolve(null) - }) -} - -export async function interpretSourcePos(stackFrames: ParsedStack[], ctx: Vitest): Promise { - for (const frame of stackFrames) { - if ('sourcePos' in frame) - continue - const ssrTransformResult = ctx.server.moduleGraph.getModuleById(frame.file)?.ssrTransformResult - const fetchResult = ctx.vitenode?.fetchCache.get(frame.file)?.result - const map = fetchResult?.map || ssrTransformResult?.map - if (!map) - continue - const sourcePos = await getOriginalPos(map as any as RawSourceMap, frame) - if (sourcePos) - frame.sourcePos = sourcePos - } - - return stackFrames -} - const stackIgnorePatterns = [ 'node:internal', '/vitest/dist/', + '/vitest/src/', '/node_modules/chai/', '/node_modules/tinypool/', '/node_modules/tinyspy/', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1302fa4736c5..5e3473f52469 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -748,20 +748,24 @@ importers: packages/vite-node: specifiers: '@types/debug': ^4.1.7 + '@types/source-map-support': ^0.5.6 cac: ^6.7.14 debug: ^4.3.4 mlly: ^0.5.16 pathe: ^0.2.0 picocolors: ^1.0.0 rollup: ^2.79.0 + source-map-support: ^0.5.21 vite: ^3.2.0 dependencies: debug: 4.3.4 mlly: 0.5.16 pathe: 0.2.0 + source-map-support: 0.5.21 vite: 3.2.1 devDependencies: '@types/debug': 4.1.7 + '@types/source-map-support': 0.5.6 cac: 6.7.14 picocolors: 1.0.0 rollup: 2.79.0 @@ -808,7 +812,6 @@ importers: pretty-format: ^27.5.1 prompts: ^2.4.2 rollup: ^2.79.0 - source-map-js: ^1.0.2 strip-ansi: ^7.0.1 strip-literal: ^0.4.2 tinybench: ^2.3.1 @@ -865,7 +868,6 @@ importers: pretty-format: 27.5.1 prompts: 2.4.2 rollup: 2.79.0 - source-map-js: 1.0.2 strip-ansi: 7.0.1 typescript: 4.8.4 vite-node: link:../vite-node @@ -7193,6 +7195,12 @@ packages: resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} dev: true + /@types/source-map-support/0.5.6: + resolution: {integrity: sha512-b2nJ9YyXmkhGaa2b8VLM0kJ04xxwNyijcq12/kDoomCt43qbHBeK2SLNJ9iJmETaAj+bKUT05PQUu3Q66GvLhQ==} + dependencies: + source-map: 0.6.1 + dev: true + /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true @@ -9481,7 +9489,6 @@ packages: /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true /buffer-xor/1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} @@ -18477,7 +18484,6 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map-url/0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} diff --git a/test/reporters/tests/__snapshots__/json.test.ts.snap b/test/reporters/tests/__snapshots__/json.test.ts.snap index 9cdc37ea070f..3f930ad33668 100644 --- a/test/reporters/tests/__snapshots__/json.test.ts.snap +++ b/test/reporters/tests/__snapshots__/json.test.ts.snap @@ -10,7 +10,7 @@ exports[`json reporter > generates correct report 1`] = ` ], "fullName": " should fail", "location": { - "column": 12, + "column": 13, "line": 6, }, "status": "failed", diff --git a/test/stacktraces/fixtures/vite.config.ts b/test/stacktraces/fixtures/vite.config.ts index 766ce8757db1..6edbcbf7ef92 100644 --- a/test/stacktraces/fixtures/vite.config.ts +++ b/test/stacktraces/fixtures/vite.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ if (id.endsWith('.imba')) { return { code: - '\n/*body*/\nimport {it,expect} from \'vitest\';\n\nexport function add(...args){\n\t\n\treturn args.reduce(function(a,b) { return a + b; },0);\n};\n\nit("add",function() {\n\t\n\texpect(add()).toBe(0);\n\texpect(add(1)).toBe(3);\n\treturn expect(add(1,2,3)).toBe(6);\n});\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMudGVzdC5pbWJhIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidXRpbHMudGVzdC5pbWJhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXQsIGV4cGVjdH0gZnJvbSAndml0ZXN0J1xuXG5leHBvcnQgZGVmIGFkZCguLi5hcmdzKVxuXHRyZXR1cm4gYXJncy5yZWR1Y2UoKGRvKGEsIGIpIGEgKyBiKSwgMClcblxuaXQgXCJhZGRcIiwgZG9cblx0ZXhwZWN0KGFkZCgpKS50b0JlIDBcblx0ZXhwZWN0KGFkZCgxKSkudG9CZSAzXG5cdGV4cGVjdChhZGQoMSwgMiwgMykpLnRvQmUgNlxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTSxFQUFFLEVBQUUsQ0FBRSxNQUFNLE9BQU8sUUFBUTs7QUFFakMsTUFBTSxDQUFDLFFBQUcsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDOztDQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBRSxRQUFFLENBQUMsQ0FBQyxDQUFFLENBQUMsSUFBRSxPQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFHLENBQUMsQ0FBQztDQUFBOztBQUV4QyxFQUFFLENBQUMsS0FBSyxDQUFFLFFBQUUsR0FBQTs7Q0FDWCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0NBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0NBQ3JCLE9BQUEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtDQUFBLENBSDFCO0FBSUY7In0=', + '\n/*body*/\nimport {it,expect} from \'vitest\';\n\nexport function add(...args){\n\t\n\treturn args.reduce(function(a,b) { return a + b; },0);\n};\n\nit("add",function() {\n\t\n\texpect(add()).toBe(0);\n\texpect(add(1)).toBe(3);\n\treturn expect(add(1,2,3)).toBe(6);\n});', map: { version: 3, file: 'add-in-imba.test.imba', diff --git a/test/stacktraces/test/__snapshots__/runner.test.ts.snap b/test/stacktraces/test/__snapshots__/runner.test.ts.snap index 54b488ab5a80..038ac0806168 100644 --- a/test/stacktraces/test/__snapshots__/runner.test.ts.snap +++ b/test/stacktraces/test/__snapshots__/runner.test.ts.snap @@ -1,22 +1,22 @@ // Vitest Snapshot v1 exports[`stacktraces should respect sourcemaps > add.test.ts > add.test.ts 1`] = ` -" ❯ add.test.ts:12:23 +" ❯ add.test.ts:12:24 10| 11| it('add', () => { 12| expect(add(a.count)).toBe(100) - | ^ + | ^ 13| expect(add(1)).toBe(1) 14| return expect(add(1, 2, 3)).toBe(6) " `; exports[`stacktraces should respect sourcemaps > add-in-imba.test.imba > add-in-imba.test.imba 1`] = ` -" ❯ add-in-imba.test.imba:8:16 +" ❯ add-in-imba.test.imba:8:17 6| it \\"add\\", do 7| expect(add()).toBe 0 8| expect(add(1)).toBe 3 - | ^ + | ^ 9| expect(add(1, 2, 3)).toBe 6 10| "