-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
collect.ts
81 lines (66 loc) · 2.19 KB
/
collect.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { relative } from 'pathe'
import { processError } from '@vitest/utils/error'
import type { File } from './types'
import type { VitestRunner } from './types/runner'
import { calculateSuiteHash, generateHash, interpretTaskModes, someTasksAreOnly } from './utils/collect'
import { clearCollectorContext, getDefaultSuite } from './suite'
import { getHooks, setHooks } from './map'
import { collectorContext } from './context'
import { runSetupFiles } from './setup'
const now = Date.now
export async function collectTests(paths: string[], runner: VitestRunner): Promise<File[]> {
const files: File[] = []
const config = runner.config
for (const filepath of paths) {
const path = relative(config.root, filepath)
const file: File = {
id: generateHash(`${path}${config.name || ''}`),
name: path,
type: 'suite',
mode: 'run',
filepath,
tasks: [],
meta: Object.create(null),
projectName: config.name,
}
clearCollectorContext(runner)
try {
const setupStart = now()
await runSetupFiles(config, runner)
const collectStart = now()
file.setupDuration = collectStart - setupStart
await runner.importFile(filepath, 'collect')
const defaultTasks = await getDefaultSuite().collect(file)
setHooks(file, getHooks(defaultTasks))
for (const c of [...defaultTasks.tasks, ...collectorContext.tasks]) {
if (c.type === 'test') {
file.tasks.push(c)
}
else if (c.type === 'custom') {
file.tasks.push(c)
}
else if (c.type === 'suite') {
file.tasks.push(c)
}
else if (c.type === 'collector') {
const suite = await c.collect(file)
if (suite.name || suite.tasks.length)
file.tasks.push(suite)
}
}
file.collectDuration = now() - collectStart
}
catch (e) {
const error = processError(e)
file.result = {
state: 'fail',
errors: [error],
}
}
calculateSuiteHash(file)
const hasOnlyTasks = someTasksAreOnly(file)
interpretTaskModes(file, config.testNamePattern, hasOnlyTasks, false, config.allowOnly)
files.push(file)
}
return files
}