Hat Typoskript eine explizite öffentliche API für NodeJS Zugriff auf mehrere Baugruppen zur Verfügung stellen?

stimmen
11

Aus einem Knoten App würde ich tun:

var typeScript = require('typescript'); 

typeScript.compile('...')

Ich suche den Compiler in ein Build-System zu implementieren, aber ohne Zugang zu einem öffentlichen API (typescript.compile, etc) ist dies unmöglich.

Hier ist ein vollständigeres Beispiel dafür, was Ich mag würde tun, obwohl die unten für Livescript, nicht Typoskript, utilitized in einem Plugin für das Build-System Brunch.io geschrieben:

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')
  ]

Neugierig, wenn jemand eine Behelfslösung gefunden?

Aktualisieren

Ich beendete meine eigene Lösung für eine Vielzahl der Probleme , die oben und an anderer Stelle aufgelistet umzusetzen. Bitte beachten Sie https://github.com/damassi/TypeScript-Watcher für weitere Informationen und Nutzung.

Veröffentlicht am 03/10/2012 um 22:40
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
8

Dies ist ein bisschen hacky aber es wird funktionieren.

Ich dachte an diesem selben gestern und ich war die Überprüfung ihres Codes. Wenn Sie ist überprüfen / typscript.js von ihrem Quelltext (Es ist eine sehr sehr große Datei, mit fast 21k Zeilen Code), sehen Sie, es schafft TypeScript.TypeScriptCompiler, und dann werden Sie feststellen, dass dies eine Art und Weise aussetzt kompiliert .

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

Nun müssen Sie eine einfache Möglichkeit, es zu belichten. Um dies zu tun, müssen Sie ihren Code ändern, weshalb diese Hacky ist. Um dies zu tun, könnten Sie ändern typescript.js durch Zugabe von:

module.exports = exports = TypeScript;

Ganz am Ende der Datei.

(: Installieren Sie das Modul in einem lokalen Rahmen für all dies: „npm installieren Typoskript“ notice), die das Objekt belichtet dann können Sie eine index.js Datei im Root des Moduls erstellen.

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

Und fertig! Jetzt können Sie es einfach anrufen und Ihren Code kompilieren Sie es. Sie können prüfen, wie die API für die Kompilierung in der tsc.js-Datei zu verwenden.

Ich entschuldige mich im Voraus für den schrecklichen Code im Voraus:

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

Aus irgendeinem Grund war, wer den Code schrieb ein echter Fan von C # und ging voran und Verwendung Methoden genannt Console.WriteLine, Schließen und Schreiben, um zu gehen, die nur Wrapper tatsächlich sind. Man könnte dies der Ober werde diese Funktionen hinzufügen zu müssen, aber Sie würden eine Menge Code in das Modul ändern müssen, und es ist es nicht wert. Ich denke, dass es am besten ist, eine Klasse zu haben, zu verlängern (oder wenn Sie noch auf JS sind, erben den Prototyp) und lassen Sie es, dass für Sie tun, um es trocken.

Etwas wirklich schön ist, dass, wenn Sie 500 Typoskript Dateien übersetzen und sie alle in einer einzigen JS-Datei, kann man einfach compiler.addUnit (anothercontent, anotherpath) nennen; 500-mal und dann sehen sie alle gehen in eine einzige Datei :)

Die Konzentration auf bessere Dinge: Wenn Sie tsc.js Code überprüfen, werden Sie eine Batch-Compiler Klasse finden. Wenn Sie dies für einen Build-Prozess wollen, könnte es besser sein, etwas robuster wie es zu benutzen. Es stellt Dateien und mehr zu beobachten.

Nachdem Sie den Code durchsucht, ich denke, ich werde nur ein Ticket für das Entwicklungsteam vor und fordert sie eine klarere API zur Verfügung zu stellen ¬¬

Hinweis: Alle Datei liest hier in synchroner Weise. Das ist schlecht, sehr schlecht, in Bezug auf Leistung. Ich weiß nicht genau, was Sie tun wollen, aber ich kann nicht mehr empfehlen, dass Sie einen Weg finden, diese async wenn möglich zu machen.

Beantwortet am 03/10/2012 um 23:52
quelle vom benutzer

stimmen
2

Derzeit ist es nicht möglich, eine Zusammenstellung zu erreichen, nur durch eine erfordern und mit Aufrufen kompilieren. Wenn man sich die harness.ts aussehen kann, gibt es ein Compiler-Modul, das eine ziemlich einfache Art und Weise zu tun, es bietet aber ich würde Sie tsc extern anrufen vorschlagen.

///<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);
    }
});

Ich glaube, dies würde die Arbeit machen.

Beantwortet am 03/10/2012 um 23:01
quelle vom benutzer

stimmen
1

Sie könnten versuchen , aus https://github.com/sinclairzx81/typescript.api . Dieses Projekt hat die require () Erweiterung Sachen, hat aber auch einige Funktionen ts Quelle manuell zu kompilieren. Es sollte möglich sein , ein automatisiertes Build - System , mit ihm zu schaffen.

beachten Sie tho seine auf dem Typoskript 0,9 Compiler gebaut, so dass Sie möglicherweise oder möglicherweise nicht über Erfolg 0.8.3 Quelle gegeben verschiedene Updates für die Sprache zu kompilieren.

Beantwortet am 13/05/2013 um 12:03
quelle vom benutzer

stimmen
1

besser erfordern könnten Sie diese Option, wenn alle helfen , erreichen Sie ausführt / Zugriff auf die Typoskript - Datei.

Damit können Sie require () Typoskript Dateien - keine Vorkompilierung erforderlich - und ein paar andere Dateiformate (Coffeescript, clojurescript, yaml, xml, etc.)

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

Disclosure: Ich schrieb besser erfordern.

Beantwortet am 01/11/2012 um 16:06
quelle vom benutzer

stimmen
1

Überprüfen Sie dieses Github - Projekt von niutech, kann es Typoskript Code JS Code on the fly konvertieren in Browser , aber ich denke , es kann leicht in node.js. arbeiten modifiziert werden werden

Beantwortet am 07/10/2012 um 07:41
quelle vom benutzer

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