95 lines
2.5 KiB
JavaScript
95 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var ts = require('typescript');
|
|
|
|
var tsOptions = {module: 'commonjs'};
|
|
|
|
function formatErrorMessage(error) {
|
|
return (
|
|
error.file.filename + '(' +
|
|
error.file.getLineAndCharacterFromPosition(error.start).line +
|
|
'): ' +
|
|
error.messageText
|
|
);
|
|
}
|
|
|
|
function compile(content, contentFilename) {
|
|
var output = null;
|
|
var compilerHost = {
|
|
getSourceFile: function(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)(?:\.d)?\.ts$')
|
|
);
|
|
|
|
if (filename === 'lib.d.ts') {
|
|
source = fs.readFileSync(
|
|
require.resolve('typescript/bin/lib.d.ts')
|
|
).toString();
|
|
} else if (filename === 'jest.d.ts') {
|
|
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: function(name, text, writeByteOrderMark) {
|
|
if (output === null) {
|
|
output = text;
|
|
} else {
|
|
throw new Error('Expected only one dependency.');
|
|
}
|
|
},
|
|
getCanonicalFileName: function(filename) {
|
|
return filename;
|
|
},
|
|
getCurrentDirectory: function() {
|
|
return '';
|
|
},
|
|
getNewLine: function() {
|
|
return '\n';
|
|
},
|
|
};
|
|
var program = ts.createProgram([
|
|
'lib.d.ts',
|
|
'jest.d.ts',
|
|
contentFilename,
|
|
], tsOptions, compilerHost);
|
|
var errors = program.getDiagnostics();
|
|
if (!errors.length) {
|
|
var checker = program.getTypeChecker(true);
|
|
errors = checker.getDiagnostics();
|
|
checker.emitFiles();
|
|
}
|
|
if (errors.length) {
|
|
throw new Error(errors.map(formatErrorMessage).join('\n'));
|
|
}
|
|
return output;
|
|
}
|
|
|
|
module.exports = {
|
|
compile: compile,
|
|
};
|