Предоставляет ли машинопись явный Public API для NodeJS модуля доступа?

голоса
11

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

var typeScript = require('typescript'); 

typeScript.compile('...')

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

Вот более полный пример того, что я хотел бы сделать, хотя ниже для LiveScript, не машинопись, utilitized в плагине, написанной для системы построения-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 для получения дополнительной информации и использования.

Задан 03/10/2012 в 22:40
источник пользователем
На других языках...                            


5 ответов

голоса
8

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

Я думал об этом тот же только вчера, и я проверял свой код. Если вы проверяете Bin / typscript.js от их исходного кода (Это очень очень большой файл, с почти 21k строк коды), вы увидите, что он создает TypeScript.TypeScriptCompiler, и тогда вы увидите, что это разоблачить способ компиляции ,

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

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

module.exports = exports = TypeScript;

В самом конце файла.

Затем, вы можете создать index.js файл в корневом каталоге модуль (заметьте: установить модуль в локальной области видимости для всех этих: «НОЙ установки машинописного»), который предоставляет объект.

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, Закрыть и записи, которые на самом деле просто фантики. Вы можете получить это из накладного того, чтобы добавить эти функции, но вы должны изменить много кода в модуле, и это не стоит. Я считаю, что лучше иметь класс, чтобы расширить (или, если вы все еще на JS, наследуйте прототип) и пусть он сделает это для вас, чтобы сделать его DRY.

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

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

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

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

Ответил 03/10/2012 в 23:52
источник пользователем

голоса
2

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

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

Ответил 03/10/2012 в 23:01
источник пользователем

голоса
1

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

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

Ответил 13/05/2013 в 12:03
источник пользователем

голоса
1

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

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

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

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

Ответил 01/11/2012 в 16:06
источник пользователем

голоса
1

Проверить этот GitHub проект по niutech, он может конвертировать код транскрипта JS код на лету в браузере , но я предполагаю , что это может быть легко модифицирован для работы в Node.js.

Ответил 07/10/2012 в 07:41
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more