Skip to content

Commit 3573032

Browse files
authoredMar 17, 2023
fix: show correct line numbers in stack trace when using vi.resetModules() (#3020)
1 parent d4d0425 commit 3573032

File tree

5 files changed

+76
-30
lines changed

5 files changed

+76
-30
lines changed
 

‎packages/vite-node/src/client.ts

+8
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,14 @@ export class ModuleCacheMap extends Map<string, ModuleCache> {
9292
return this.deleteByModuleId(this.normalizePath(fsPath))
9393
}
9494

95+
invalidateModule(mod: ModuleCache) {
96+
delete mod.evaluated
97+
delete mod.resolving
98+
delete mod.promise
99+
delete mod.exports
100+
return true
101+
}
102+
95103
/**
96104
* Invalidate modules that dependent on the given modules, up to the main entry
97105
*/

‎packages/vitest/src/utils/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ export function resetModules(modules: ModuleCacheMap, resetMocks = false) {
3131
// don't clear mocks
3232
...(!resetMocks ? [/^mock:/] : []),
3333
]
34-
modules.forEach((_, path) => {
34+
modules.forEach((mod, path) => {
3535
if (skipPaths.some(re => re.test(path)))
3636
return
37-
modules.delete(path)
37+
modules.invalidateModule(mod)
3838
})
3939
}
4040

‎test/core/test/utils.spec.ts

+36-27
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { describe, expect, test } from 'vitest'
1+
import { beforeAll, describe, expect, test } from 'vitest'
22
import { assertTypes, deepClone, objectAttr, toArray } from '@vitest/utils'
33
import { deepMerge, resetModules } from '../../../packages/vitest/src/utils'
44
import { deepMergeSnapshot } from '../../../packages/vitest/src/integrations/snapshot/port/utils'
5-
import type { ModuleCacheMap } from '../../../packages/vite-node/src/types'
5+
import type { EncodedSourceMap } from '../../../packages/vite-node/src/types'
6+
import { ModuleCacheMap } from '../../../packages/vite-node/dist/client'
67

78
describe('assertTypes', () => {
89
test('the type of value should be number', () => {
@@ -151,36 +152,44 @@ describe('deepClone', () => {
151152
})
152153

153154
describe('resetModules doesn\'t resets only user modules', () => {
154-
test('resets user modules', () => {
155-
const moduleCache = new Map() as ModuleCacheMap
156-
moduleCache.set('/some-module.ts', {})
157-
moduleCache.set('/@fs/some-path.ts', {})
158-
159-
resetModules(moduleCache)
160-
161-
expect(moduleCache.size).toBe(0)
162-
})
163-
164-
test('doesn\'t reset vitest modules', () => {
165-
const moduleCache = new Map() as ModuleCacheMap
166-
moduleCache.set('/node_modules/vitest/dist/index.js', {})
167-
moduleCache.set('/node_modules/vitest-virtual-da9876a/dist/index.js', {})
168-
moduleCache.set('/node_modules/some-module@vitest/dist/index.js', {})
169-
moduleCache.set('/packages/vitest/dist/index.js', {})
170-
155+
const mod = () => ({ evaluated: true, promise: Promise.resolve({}), resolving: false, exports: {}, map: {} as EncodedSourceMap })
156+
157+
const moduleCache = new ModuleCacheMap()
158+
const modules = [
159+
['/some-module.ts', true],
160+
['/@fs/some-path.ts', true],
161+
['/node_modules/vitest/dist/index.js', false],
162+
['/node_modules/vitest-virtual-da9876a/dist/index.js', false],
163+
['/node_modules/some-module@vitest/dist/index.js', false],
164+
['/packages/vitest/dist/index.js', false],
165+
['mock:/some-module.ts', false],
166+
['mock:/@fs/some-path.ts', false],
167+
] as const
168+
169+
beforeAll(() => {
170+
modules.forEach(([path]) => {
171+
moduleCache.set(path, mod())
172+
})
171173
resetModules(moduleCache)
172-
173-
expect(moduleCache.size).toBe(4)
174174
})
175175

176-
test('doesn\'t reset mocks', () => {
177-
const moduleCache = new Map() as ModuleCacheMap
178-
moduleCache.set('mock:/some-module.ts', {})
179-
moduleCache.set('mock:/@fs/some-path.ts', {})
176+
test.each(modules)('Cashe for %s is reseted (%s)', (path, reset) => {
177+
const cached = moduleCache.get(path)
180178

181-
resetModules(moduleCache)
179+
if (reset) {
180+
expect(cached).not.toHaveProperty('evaluated')
181+
expect(cached).not.toHaveProperty('resolving')
182+
expect(cached).not.toHaveProperty('exports')
183+
expect(cached).not.toHaveProperty('promise')
184+
}
185+
else {
186+
expect(cached).toHaveProperty('evaluated')
187+
expect(cached).toHaveProperty('resolving')
188+
expect(cached).toHaveProperty('exports')
189+
expect(cached).toHaveProperty('promise')
190+
}
182191

183-
expect(moduleCache.size).toBe(2)
192+
expect(cached).toHaveProperty('map')
184193
})
185194
})
186195

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { assert, describe, expect, it, vi } from 'vitest'
2+
3+
describe('suite name', () => {
4+
it('foo', () => {
5+
vi.resetModules()
6+
// a comment here
7+
// another comment
8+
// another comment
9+
// another comment
10+
// another comment
11+
// another comment
12+
// this will mess up the stacktrace lines
13+
expect(1 + 1).eq(2)
14+
expect(2 + 1).eq(3)
15+
assert.equal(Math.sqrt(4), 2)
16+
expect(Math.sqrt(4)).toBe(1)
17+
})
18+
})

‎test/stacktraces/test/__snapshots__/runner.test.ts.snap

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Vitest Snapshot v1
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`stacktraces should pick error frame if present > frame.spec.imba > frame.spec.imba 1`] = `
44
" FAIL frame.spec.imba [ frame.spec.imba ]
@@ -43,3 +43,14 @@ exports[`stacktraces should respect sourcemaps > add-in-js.test.js > add-in-js.t
4343
8| return expect(add(1, 2, 3)).toBe(6)
4444
"
4545
`;
46+
47+
exports[`stacktraces should respect sourcemaps > reset-modules.test.ts > reset-modules.test.ts 1`] = `
48+
" ❯ reset-modules.test.ts:16:26
49+
14| expect(2 + 1).eq(3)
50+
15| assert.equal(Math.sqrt(4), 2)
51+
16| expect(Math.sqrt(4)).toBe(1)
52+
| ^
53+
17| })
54+
18| })
55+
"
56+
`;

0 commit comments

Comments
 (0)
Please sign in to comment.