Czy maszynopis zapewnić wyraźny publicznych API dla modułu NodeJS Access?

głosy
11

Od wewnątrz aplikacji węzła chciałbym zrobić:

var typeScript = require('typescript'); 

typeScript.compile('...')

Czekam na wdrożenie kompilator do systemu kompilacji, ale bez dostępu do API publicznego (typescript.compile, etc) jest to niemożliwe.

Oto bardziej kompletny przykład tego, co chciałbym zrobić, mimo że poniżej jest dla LiveScript, nie maszynopis, utilitized w wtyczki napisane dla systemu budowania-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')
  ]

Ciekawy, czy ktoś znalazł obejście?

Aktualizacja

Skończyło się na wdrażaniu własne rozwiązania różnych problemów wymienionych powyżej i gdzie indziej. Proszę zobaczyć https://github.com/damassi/TypeScript-Watcher uzyskać więcej informacji i wykorzystania.

Utwórz 03/10/2012 o 22:40
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
8

Ten jest nieco hacky, ale to będzie działać.

Myślałem o tym samym tylko wczoraj i byłem sprawdzanie ich kodu. Jeśli zaznaczysz bin / typscript.js z ich kodu źródłowego (Jest to bardzo duży plik, z prawie 21k linii kodu), widać, że tworzy TypeScript.TypeScriptCompiler, a następnie okaże się, że to robi narazić sposób kompilowania ,

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

Teraz trzeba łatwy sposób narażać. Aby to zrobić, trzeba będzie zmodyfikować swój kod, który jest dlaczego to hacky. Aby to zrobić, można modyfikować typescript.js dodając:

module.exports = exports = TypeScript;

Prawo na końcu pliku.

Następnie można utworzyć plik index.js w głównym modułu (Uwaga: należy zainstalować moduł w lokalnym zakresie za to wszystko: „npm zainstalować maszynopis”), które wystawia przedmiot.

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

I gotowy! Teraz można tylko nazwać i skompilować kod używając go. Można sprawdzić, w jaki sposób korzystać z interfejsu API do kompilacji w pliku tsc.js.

Przepraszam z góry za okropny kodu przed:

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

Z jakiegoś powodu ten, kto napisał kod był prawdziwym fanem C # i zaczął iść do przodu i metod mechanicznych nazywa WriteLine, Close i zapisu, które są w rzeczywistości tylko owijarki. Można dostać to od napowietrznej konieczności dodawania tej funkcji, ale trzeba by zmodyfikować dużo kodu w module, a to nie jest tego warte. Myślę, że najlepiej jest mieć klasę rozszerzenia (lub jeśli jesteś wciąż na JS, dziedziczyć prototyp) i niech to zrobić dla Ciebie, aby go wysuszyć.

Coś naprawdę miłe jest to, że jeśli chcesz przetłumaczyć 500 maszynopis pliki i umieścić je wszystkie w jednym pliku .js, można po prostu zadzwonić compiler.addUnit (anothercontent, anotherpath); 500 razy, a następnie sprawdzić to wszystko iść w jednym pliku :)

Skupiając się na lepszych rzeczy: jeśli zaznaczysz tsc.js kod znajdziesz klasę kompilatora partii. Jeśli chcesz, to dla procesu kompilacji, to może być lepiej użyć coś bardziej solidnego podoba. Zapewnia oglądania plików i więcej.

Po przeglądałem kod, myślę, że po prostu przesłać zgłoszenie do zespołu projektowego i poprosić ich, aby zapewnić jaśniejsze API ¬¬

Uwaga: Wszystkie pliki czyta tutaj odbywa się w sposób synchroniczny. Jest źle, bardzo źle, jeśli chodzi o wydajność. Nie wiem dokładnie, co masz zamiar zrobić, ale nie mogę polecić bardziej, że można znaleźć sposób, aby to asynchronicznie jeśli to możliwe.

Odpowiedział 03/10/2012 o 23:52
źródło użytkownik

głosy
2

Obecnie nie jest możliwe do osiągnięcia tylko przez kompilację mającą wymagać i nazywając skompilować. Jeśli można spojrzeć na harness.ts istnieje moduł kompilator, który zapewnia dość prosty sposób to zrobić, ale chciałbym zaproponować Ci zadzwonić TSC zewnętrznie.

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

Wierzę, że to będzie wykonać zadanie.

Odpowiedział 03/10/2012 o 23:01
źródło użytkownik

głosy
1

Można wypróbować https://github.com/sinclairzx81/typescript.api . Ten projekt robi require () przedłużenie rzeczy, ale ma również pewne funkcje do ręcznej kompilacji ts źródło. Powinno być możliwe stworzenie zautomatyzowanego systemu kompilacji z nim.

Uwaga tho jego zbudowany na maszynopis 0,9 kompilator, więc może lub nie może mieć sukces kompilacji 0.8.3 źródłowe podane różne aktualizacje do języka.

Odpowiedział 13/05/2013 o 12:03
źródło użytkownik

głosy
1

lepiej wymagać może pomóc osiągnąć ten cel, jeśli tylko chcesz realizuje / dostępu do pliku wynikowego.

Pozwala require () plików maszynopisu - no pre-kompilacji potrzebne - i kilka innych formatów (coffeescript, clojurescript, YAML, XML, itd.)

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

Ujawnienie: Napisałem lepiej wymagać.

Odpowiedział 01/11/2012 o 16:06
źródło użytkownik

głosy
1

Sprawdzić ten projekt GitHub przez niutech, może konwertować kod maszynopis do kodu JS w locie w przeglądarce , ale myślę, że można być łatwo modyfikowane do pracy w node.js.

Odpowiedział 07/10/2012 o 07:41
źródło użytkownik

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