text: '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)(?:\.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,
  };
  