-
Notifications
You must be signed in to change notification settings - Fork 26.1k
/
runTypeCheck.ts
59 lines (51 loc) · 1.72 KB
/
runTypeCheck.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
import {
DiagnosticCategory,
getFormattedDiagnostic,
} from './diagnosticFormatter'
import { getTypeScriptConfiguration } from './getTypeScriptConfiguration'
import { TypeScriptCompileError } from './TypeScriptCompileError'
import { getRequiredConfiguration } from './writeConfigurationDefaults'
export interface TypeCheckResult {
hasWarnings: boolean
warnings?: string[]
}
export async function runTypeCheck(
ts: typeof import('typescript'),
baseDir: string,
tsConfigPath: string
): Promise<TypeCheckResult> {
const effectiveConfiguration = await getTypeScriptConfiguration(
ts,
tsConfigPath
)
if (effectiveConfiguration.fileNames.length < 1) {
return { hasWarnings: false }
}
const requiredConfig = getRequiredConfiguration(ts)
const program = ts.createProgram(effectiveConfiguration.fileNames, {
...effectiveConfiguration.options,
...requiredConfig,
noEmit: true,
})
const result = program.emit()
const regexIgnoredFile = /[\\/]__(?:tests|mocks)__[\\/]|(?:spec|test)\.[^\\/]+$/
const allDiagnostics = ts
.getPreEmitDiagnostics(program)
.concat(result.diagnostics)
.filter((d) => !(d.file && regexIgnoredFile.test(d.file.fileName)))
const firstError =
allDiagnostics.find(
(d) => d.category === DiagnosticCategory.Error && Boolean(d.file)
) ?? allDiagnostics.find((d) => d.category === DiagnosticCategory.Error)
if (firstError) {
throw new TypeScriptCompileError(
await getFormattedDiagnostic(ts, baseDir, firstError)
)
}
const warnings = await Promise.all(
allDiagnostics
.filter((d) => d.category === DiagnosticCategory.Warning)
.map((d) => getFormattedDiagnostic(ts, baseDir, d))
)
return { hasWarnings: true, warnings }
}