Предоставляет ли TypeScript явный открытый API для доступа к модулю NodeJS?

В приложении node я хотел бы сделать:

var typeScript = require('typescript'); 

typeScript.compile('...')

Я хочу реализовать компилятор в системе сборки, но без доступа к публичному API (typescript.compile и т.д.) это невозможно.

Вот более полный пример того, что я хотел бы сделать, хотя ниже для LiveScript, а не TypeScript, утилита в плагине, написанном для системы сборки Brunch.io:

LiveScript = require 'LiveScript'
sysPath = require 'path'

module.exports = class LiveScriptCompiler
  brunchPlugin: yes
  type: 'javascript'
  extension: 'ls'

  constructor: (@config) ->
    null

  compile: (data, path, callback) ->
    try
      result = LiveScript.compile data, bare: yes
    catch err
      error = err
    finally
      callback error, result

  include: [
    (sysPath.join __dirname, '..', 'vendor', 'prelude-browser-0.6.0.js')
  ]

Любопытно, если кто-нибудь нашел работу вокруг?

Обновление

Я закончил реализацию своего собственного решения для множества проблем, перечисленных выше и в других местах. Для получения дополнительной информации и использования см. https://github.com/damassi/TypeScript-Watcher.

Ответ 1

Этот бит немного взломан, но он будет работать.

Я подумал об этом совсем недавно, и я проверял их код. Если вы проверите bin/typscript.js со своим исходным кодом (это очень большой файл с почти 21k строками кода), вы увидите, что он создает TypeScript.TypeScriptCompiler, а затем вы обнаружите, что это ДЕЙСТВИТЕЛЬНО раскрывает путь компиляции.

var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile, 
    new TypeScript.NullLogger(), settings);

Теперь вам нужен простой способ разоблачить его. Чтобы сделать это, вам придется изменить свой код, поэтому он взломан. Для этого вы можете изменить TypeScript.js, добавив:

module.exports = exports = TypeScript;

В правой части файла.

Затем вы можете создать файл index.js в корневом модуле (обратите внимание: установите модуль в локальной области для всего этого: "npm install typescript" ), который предоставляет объект.

exports.TypeScript = require("bin/typescript");

И готов! Теперь вы можете просто позвонить и скомпилировать свой код. Вы можете проверить, как использовать API для компиляции в файле tsc.js.

Я заранее извиняюсь за ужасный код:

var fs = require("fs");
var TypeScript = require("typescript");
var path = "test.ts";
var pathout = "test.js";
var content = fs.readFileSync(path, "utf-8");
var fd = fs.openSync(pathout, 'w'); 
var outFile = { 
    Write: function (str) { 
        fs.writeSync(fd, str); 
    }, 
    WriteLine: function (str) {
    console.log(fd, str); 
        fs.writeSync(fd, str + '\r\n'); 
    }, 
    Close: function () { 
        fs.closeSync(fd); 
        fd = null; 
    } 
};
var createFile = function (path) { 
    function mkdirRecursiveSync(path) { 
        var stats = fs.statSync(path); 
        if(stats.isFile()) { 
            throw "\"" + path + "\" exists but isn't a directory."; 
        } else { 
            if(stats.isDirectory()) { 
                return; 
            } else { 
                mkdirRecursiveSync(_path.dirname(path)); 
                fs.mkdirSync(path, 509); 
            } 
        } 
    } 
    mkdirRecursiveSync(_path.dirname(path));
    console.log(path) 
    var fd = fs.openSync(path, 'w'); 
    return { 
        Write: function (str) { 
            fs.writeSync(fd, str); 
        }, 
        WriteLine: function (str) { 
            fs.writeSync(fd, str + '\r\n'); 
        }, 
        Close: function () { 
            fs.closeSync(fd); 
            fd = null; 
        } 
    }; 
};
var stderr = { 
    Write: function (str) { 
        process.stderr.write(str); 
    }, 
    WriteLine: function (str) { 
        process.stderr.write(str + '\n'); 
    }, 
    Close: function () { 
    } 
}
var compiler = new TypeScript.TypeScriptCompiler(outFile, outFile);
compiler.setErrorOutput(stderr);
compiler.addUnit(content, path);
compiler.typeCheck();
compiler.emit(false, createFile);
outFile.Close();

По какой-то причине тот, кто написал код, был настоящим поклонником С# и продолжил работу и использовал методы, называемые WriteLine, Close и Write, которые на самом деле просто обертки. Вы можете получить из этого накладные расходы, связанные с необходимостью добавления этих функций, но вам придется модифицировать много кода в модуле, и это не стоит. Я думаю, что лучше всего расширить класс (или если вы все еще на JS, наследуете прототип), и пусть это сделает это для вас, чтобы сделать его сухим.

Что-то действительно приятное в том, что если вы хотите перевести 500 файлов TypeScript и поместить их все в один .js файл, вы можете просто вызвать compiler.addUnit(anothercontent, anotherpath); 500 раз, а затем увидеть все это в один файл:)

Фокусировка на лучших вещах: если вы проверите код tsc.js, вы найдете класс компилятора пакета. Если вы хотите, чтобы это было для процесса сборки, лучше было бы использовать что-то более надежное. Он обеспечивает просмотр файлов и многое другое.

Просматривая код, я думаю, что просто отправлю билет команде разработчиков и попрошу предоставить более четкий API ¬¬

Примечание. Все файлы, которые читаются здесь, выполняются синхронно. Это плохо, очень плохо, с точки зрения производительности. Я точно не знаю, что вы планируете делать, но я не могу рекомендовать больше, чтобы найти способ сделать этот асинхронный, если это возможно.

Ответ 2

В настоящее время невозможно выполнить компиляцию только с помощью компиляции require и call. Если вы можете посмотреть на harness.ts, есть модуль компилятора, который предоставляет довольно простой способ сделать это, но я бы предложил вам вызвать tsc извне.

///<reference path='node.d.ts'/>
import exec = module('child_process');

var child = exec.exec('tsc foo.ts',
  function (error, stdout, stderr) {
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

Я считаю, что это сработает.

Ответ 3

Отметьте этот проект github от niutech, он может преобразовать код TypeScript в JS-код на лету в браузере, но я думаю, его можно легко модифицировать для работы в node.js.

Ответ 4

better-require может помочь вам достичь этого, если все, что вы хотите, выполняет/получает доступ к файлу typescript.

Он позволяет вам запрашивать() typescript файлы - не требуется предварительная компиляция - и множество других форматов файлов (coffeescript, clojurescript, yaml, xml и т.д.)

require('better-require')();
var myModule = require('./mymodule.ts');

Раскрытие информации: я написал лучше-требую.

Ответ 5

Вы можете попробовать https://github.com/sinclairzx81/typescript.api. Этот проект использует материал require(), но также имеет некоторые функции для компиляции источника ts вручную. Должна быть возможность создать с ним автоматизированную систему сборки.

Обратите внимание, что он построен на компиляторе typescript 0.9, поэтому у вас может быть или не быть успеха компиляции 0.8.3 источника с учетом различных обновлений языка.