TypeScript предоставляет явную публичную API для доступа модуля Nodejs?

StackOverflow https://stackoverflow.com//questions/12717309

Вопрос

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

var typeScript = require('typescript'); 

typeScript.compile('...')
.

Я ищу реализовать компилятор в систему сборки, но без доступа к публичной API (Teamescript.comPile, и т. Д.) Это невозможно.

Вот более полный пример того, что я хотел бы сделать, хотя приведен ниже for Isitecript, а не в Typscript, используемый в плагине, написанном для Brunch.io Build-System:

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 для получения дополнительной информации и использования.

Это было полезно?

Решение

Это немного хакей, но это будет работать.

Я думал об этом очень только вчера, и я проверял их код. Если вы проверяете BIN / Typscript.js с их Sourcecode (это очень очень большой файл, с почти 21K строки кода), вы увидите, что он создает TeampScript.TypescriptCompiler, а затем вы обнаружите, что это выясняет способ компиляции ,

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

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

module.exports = exports = TypeScript;
.

прямо в конце файла.

Затем вы можете создать файл index.js в корне модуля (обратите внимание: установить модуль в локальном объеме для всего этого: «NPM Instally Tymdercript»), который обнажает объект.

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();
.

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

Что-то действительно приятно, если вы хотите перевести 500 файлов TeampScript и поместите их все в один файл .js, вы можете просто позвонить Compiler.addunit (OnlyContent, onutionPath); 500 раз, а затем увидим все это зайти в один файл :)

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

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

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

Другие советы

В настоящее время невозможно добиться компиляции, просто имея требуемую и вызывающую компиляцию.Если вы сможете посмотреть на ramness.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);
    }
});
.

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

Check Этот проект GitHub Niutech, он может конвертировать TeamptScript Code в код JS на лету в браузере , но я думаю, его можно легко модифицировать для работы в node.js.

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

Это позволяет вам потребовать () файлы TypeScript - не требуется предварительная компиляция - и куча других форматов файлов (CoffeeScript, Clojurecript, Yaml, XML и т. Д.)

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

Раскрытие: Я написал лучше.

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

Обратите внимание, что его настроен на типографии 0,9 компилятора, поэтому вы можете иметь или не иметь успеха, составив 0,8,3 источника, данные различные обновления языка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top