Skip to content

Commit

Permalink
feat: display error frame if present (like Vite) (#2257)
Browse files Browse the repository at this point in the history
Co-authored-by: Vladimir <sheremet.va@icloud.com>
fixes #2256
  • Loading branch information
haikyuu committed Nov 7, 2022
1 parent 3c3451b commit cd1d8fd
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 11 deletions.
26 changes: 15 additions & 11 deletions packages/vitest/src/node/error.ts
Expand Up @@ -54,19 +54,23 @@ export async function printError(error: unknown, ctx: Vitest, options: PrintErro

if (type)
printErrorType(type, ctx)

printErrorMessage(e, ctx.logger)
printStack(ctx, stacks, nearest, errorProperties, (s, pos) => {
if (showCodeFrame && s === nearest && nearest) {
const file = fileFromParsedStack(nearest)
// could point to non-existing original file
// for example, when there is a source map file, but no source in node_modules
if (existsSync(file)) {
const sourceCode = readFileSync(file, 'utf-8')
ctx.logger.log(c.yellow(generateCodeFrame(sourceCode, 4, pos)))
if (e.frame) {
ctx.logger.log(c.yellow(e.frame))
}
else {
printStack(ctx, stacks, nearest, errorProperties, (s, pos) => {
if (showCodeFrame && s === nearest && nearest) {
const file = fileFromParsedStack(nearest)
// could point to non-existing original file
// for example, when there is a source map file, but no source in node_modules
if (existsSync(file)) {
const sourceCode = readFileSync(file, 'utf-8')
ctx.logger.log(c.yellow(generateCodeFrame(sourceCode, 4, pos)))
}
}
}
})
})
}

if (e.cause && 'name' in e.cause) {
(e.cause as any).name = `Caused by: ${(e.cause as any).name}`
Expand Down
1 change: 1 addition & 0 deletions packages/vitest/src/types/general.ts
Expand Up @@ -72,6 +72,7 @@ export interface ErrorWithDiff extends Error {
expected?: any
operator?: string
type?: string
frame?: string
}

export interface ModuleGraphData {
Expand Down
4 changes: 4 additions & 0 deletions test/stacktraces/fixtures/frame.spec.imba
@@ -0,0 +1,4 @@
describe "Test" do
test("1+1") do
expect(1+1).toBe 2
ciyet.
16 changes: 16 additions & 0 deletions test/stacktraces/fixtures/vite.config.ts
Expand Up @@ -4,6 +4,22 @@ export default defineConfig({
plugins: [{
name: 'vite-plugin-imba',
transform(code, id) {
if (id.endsWith('frame.spec.imba')) {
// eslint-disable-next-line no-throw-literal
throw {
name: 'imba-parser error',
id,
message: 'Unexpected \'CALL_END\'',
code,
frame:
'4 | test("1+1") do\n5 | expect(1+1).toBe 2\n6 | frame.\n | ^\n7 |\n',
loc: {
line: 3,
column: 11,
file: id,
},
}
}
if (id.endsWith('.imba')) {
return {
code:
Expand Down
11 changes: 11 additions & 0 deletions test/stacktraces/test/__snapshots__/runner.test.ts.snap
@@ -1,5 +1,16 @@
// Vitest Snapshot v1

exports[`stacktraces should pick error frame if present > frame.spec.imba > frame.spec.imba 1`] = `
" ❯ frame.spec.imba (0 test)
4 | test(\\"1+1\\") do
5 | expect(1+1).toBe 2
6 | frame.
| ^
7 |
"
`;

exports[`stacktraces should respect sourcemaps > add.test.ts > add.test.ts 1`] = `
" ❯ add.test.ts:12:24
10|
Expand Down
32 changes: 32 additions & 0 deletions test/stacktraces/test/runner.test.ts
Expand Up @@ -34,3 +34,35 @@ describe('stacktraces should respect sourcemaps', async () => {
}, 30000)
}
})

describe('stacktraces should pick error frame if present', async () => {
const root = resolve(__dirname, '../fixtures')
const files = ['frame.spec.imba']

for (const file of files) {
it(file, async () => {
// in Windows child_process is very unstable, we skip testing it
if (process.platform === 'win32' && process.env.CI)
return

let error: any
await execa('npx', ['vitest', 'run', file], {
cwd: root,
env: {
...process.env,
CI: 'true',
NO_COLOR: 'true',
},
})
.catch((e) => {
error = e
})

expect(error).toBeTruthy()
const lines = String(error).split(/\n/g)
const index = lines.findIndex(val => val.includes('(0 test)'))
const msg = lines.slice(index, index + 8).join('\n')
expect(msg).toMatchSnapshot(file)
}, 30000)
}
})

0 comments on commit cd1d8fd

Please sign in to comment.