-
Notifications
You must be signed in to change notification settings - Fork 241
/
TypescriptTranspiler.ts
71 lines (64 loc) · 2.6 KB
/
TypescriptTranspiler.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
import { Config } from 'stryker-api/config';
import { Transpiler, TranspileResult, TranspilerOptions, FileLocation } from 'stryker-api/transpile';
import { File } from 'stryker-api/core';
import { filterOutTypescriptFiles, getCompilerOptions, getProjectDirectory, isToBeTranspiled, filterEmpty } from './helpers/tsHelpers';
import TranspilingLanguageService from './transpiler/TranspilingLanguageService';
import { setGlobalLogLevel } from 'log4js';
export default class TypescriptTranspiler implements Transpiler {
private languageService: TranspilingLanguageService;
private readonly next: Transpiler;
private readonly config: Config;
private readonly keepSourceMaps: boolean;
constructor(options: TranspilerOptions) {
setGlobalLogLevel(options.config.logLevel);
this.config = options.config;
this.keepSourceMaps = options.keepSourceMaps;
}
transpile(files: File[]): Promise<TranspileResult> {
const typescriptFiles = filterOutTypescriptFiles(files);
if (!this.languageService) {
this.languageService = new TranspilingLanguageService(
getCompilerOptions(this.config), typescriptFiles, getProjectDirectory(this.config), this.keepSourceMaps);
} else {
this.languageService.replace(typescriptFiles);
}
return Promise.resolve(this.transpileAndResult(typescriptFiles, files));
}
getMappedLocation(sourceFileLocation: FileLocation): FileLocation {
const outputLocation = this.languageService.getMappedLocationFor(sourceFileLocation);
if (outputLocation) {
return this.next.getMappedLocation(outputLocation);
} else {
throw new Error(`Could not find mapped location for ${sourceFileLocation.fileName}:${sourceFileLocation.start.line}:${sourceFileLocation.start.column}`);
}
}
private transpileAndResult(typescriptFiles: File[], allFiles: File[]) {
const error = this.languageService.getSemanticDiagnostics(typescriptFiles.map(file => file.name));
if (error.length) {
return this.createErrorResult(error);
} else {
const outputFiles = this.languageService.emit(typescriptFiles);
// Keep original order of the files
const resultFiles = filterEmpty(allFiles.map(file => {
if (isToBeTranspiled(file)) {
return outputFiles[file.name];
} else {
return file;
}
}));
return this.createSuccessResult(resultFiles);
}
}
private createErrorResult(error: string): TranspileResult {
return {
error,
outputFiles: []
};
}
private createSuccessResult(outputFiles: File[]): TranspileResult {
return {
error: null,
outputFiles
};
}
}