forked from facebook/react
-
Notifications
You must be signed in to change notification settings - Fork 1
/
ts-preprocessor.js
101 lines (93 loc) · 2.64 KB
/
ts-preprocessor.js
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
'use strict';
var fs = require('fs');
var path = require('path');
var ts = require('typescript');
var tsOptions = {
module: ts.ModuleKind.CommonJS,
jsx: ts.JsxEmit.React,
};
function formatErrorMessage(error) {
return (
error.file.filename + '(' +
error.file.getLineAndCharacterOfPosition(error.start).line +
'): ' +
error.messageText
);
}
function compile(content, contentFilename) {
var output = null;
var compilerHost = {
getSourceFile(filename, languageVersion) {
var source;
// `path.normalize` and `path.join` are used to turn forward slashes in
// the file path into backslashes on Windows.
filename = path.normalize(filename);
var reactRegex = new RegExp(
path.join('/', '(?:React|ReactDOM|PropTypes)(?:\.d)?\.ts$')
);
var jestRegex = /jest\.d\.ts/;
if (filename === 'lib.d.ts') {
source = fs.readFileSync(
require.resolve('typescript/lib/lib.d.ts')
).toString();
} else if (filename.match(jestRegex)) {
source = fs.readFileSync(
path.join(__dirname, 'jest.d.ts')
).toString();
} else if (filename === contentFilename) {
source = content;
} else if (reactRegex.test(filename)) {
// TypeScript will look for the .d.ts files in each ancestor directory,
// so there may not be a file at the referenced path as it climbs the
// hierarchy.
try {
source = fs.readFileSync(filename).toString();
} catch (e) {
if (e.code === 'ENOENT') {
return undefined;
}
throw e;
}
} else {
throw new Error('Unexpected filename ' + filename);
}
return ts.createSourceFile(filename, source, 'ES5', '0');
},
writeFile(name, text, writeByteOrderMark) {
if (output === null) {
output = text;
} else {
throw new Error('Expected only one dependency.');
}
},
getCanonicalFileName(filename) {
return filename;
},
getCurrentDirectory() {
return '';
},
getNewLine() {
return '\n';
},
fileExists(filename) {
return ts.sys.fileExists(filename);
},
useCaseSensitiveFileNames() {
return ts.sys.useCaseSensitiveFileNames;
},
};
var program = ts.createProgram([
'lib.d.ts',
'jest.d.ts',
contentFilename,
], tsOptions, compilerHost);
var emitResult = program.emit();
var errors = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
if (errors.length) {
throw new Error(errors.map(formatErrorMessage).join('\n'));
}
return output;
}
module.exports = {
compile: compile,
};