Are typescript oferă un API public explicit pentru NodeJS Modul de acces?

voturi
11

Din cadrul unei aplicații nod, aș dori să fac:

var typeScript = require('typescript'); 

typeScript.compile('...')

Caut să pună în aplicare compilator într-un sistem de construcție, dar fără a avea acces la un API publice (typescript.compile, etc), acest lucru este imposibil.

Iată un exemplu mai completă a ceea ce aș vrea să fac, deși mai jos este pentru LiveScript, nu typescript, utilitized într-un plugin scris pentru sistemul de build-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')
  ]

Curios dacă cineva a găsit o lucrare în jurul valorii de?

Actualizați

Am terminat de punere în aplicare propria soluție la o varietate de problemele enumerate mai sus și în altă parte. Vă rugăm să consultați https://github.com/damassi/TypeScript-Watcher pentru mai multe informații și de utilizare.

Întrebat 03/10/2012 la 22:40
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
8

Acesta este un pic Hacky, dar va funcționa.

M-am gândit acest lucru foarte aceeași doar ieri și am fost verificat codul lor. Dacă bifați bin / typscript.js de la sourcecode lor (Acesta este un fișier foarte foarte mare, cu aproape 21k linii de cod), veți vedea că aceasta creează TypeScript.TypeScriptCompiler, iar apoi veți găsi că acest lucru nu expune o modalitate de compilare .

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

Acum, aveți nevoie de o modalitate ușoară de a-l expune. Pentru a face acest lucru, va trebui să modificați codul lor, motiv pentru care acest lucru este hacky. Pentru a face acest lucru, ai putea modifica typescript.js adăugând:

module.exports = exports = TypeScript;

Chiar la sfârșitul fișierului.

Apoi, puteți crea un fișier index.js în rădăcina modulului (Notă: instalați modulul într-un domeniu de aplicare local, pentru toate acestea: „install NPM dactilografiat“), care expune obiectul.

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

Și gata! Acum puteți apela doar și compila codul folosindu-l. Puteți verifica modul de a utiliza API-ul pentru compilarea în fișierul tsc.js.

Îmi cer scuze în avans pentru codul oribil înainte:

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

Din anumite motive, cel care a scris codul a fost un fan real al C # și a început să meargă mai departe și metodele de utilizare numit WriteLine, Închide și să scrie, care sunt, de fapt, doar ambalaje. Ai putea obține acest overhead de a avea pentru a adăuga aceste funcții, dar ar trebui să modifice o mulțime de cod în modulul și nu este în valoare de ea. Cred că cel mai bine este de a avea o clasă să se extindă (sau dacă sunteți încă pe JS, moștenesc prototipul) și lăsați-o să facă acest lucru pentru tine, pentru a face uscat.

Ceva foarte frumos este că, dacă doriți să traduceți 500 de fișiere și să le typescript toate puse într-un singur fișier .js, puteți apela doar compiler.addUnit (anothercontent, anotherpath); De 500 de ori și apoi să vedem totul merge într-un singur fișier :)

Concentrându-se pe lucruri mai bune: dacă bifați tsc.js cod, veți găsi o clasă de compilator lot. Dacă doriți acest lucru pentru un proces de construcție, ar fi mai bine să utilizați ceva mai robust ca ea. Acesta oferă fișiere vizionarea și mai mult.

După ce a răsfoit codul, cred că voi depune doar un bilet la echipa de dezvoltare și de a le cere să furnizeze un API mai clar ¬¬

Notă: Toate fișierul citește aici se fac într-un mod sincron. Acest lucru este rău, foarte rău, în termeni de performanță. Nu știu exact ce aveți de gând să faci, dar nu am putut recomanda mai mult să găsească o modalitate de a face acest lucru, dacă este posibil asincronă.

Publicat 03/10/2012 la 23:52
sursa de către utilizator

voturi
2

În prezent, nu este posibil de a realiza o compilație doar prin a avea o nevoie și de asteptare compila. Dacă vă puteți uita la harness.ts există un modul de compilator, care oferă o modalitate destul de simplă de a face acest lucru, dar aș sugera să sun TSC extern.

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

Cred că acest lucru ar face treaba.

Publicat 03/10/2012 la 23:01
sursa de către utilizator

voturi
1

Ai putea încerca https://github.com/sinclairzx81/typescript.api . Acest proiect face nevoie () chestii extensie, dar , de asemenea , are unele funcționalități pentru a compila manual ts sursă. Ar trebui să fie posibil să se creeze un sistem automatizat construi cu ea.

nota Tho construit sale pe compilator dactilografiat 0.9, astfel încât să poate sau nu poate avea succes compilarea 0.8.3 sursă date diferite actualizări ale limbii.

Publicat 13/05/2013 la 12:03
sursa de către utilizator

voturi
1

mai bine nevoie ar putea ajuta să realizeze acest lucru , dacă tot ce doriți este executarea / accesarea fișierului dactilografiate.

Acesta vă permite să solicite () fișiere typescript - nici o pre-compilare necesare - și o grămadă de alte formate de fișiere (coffeescript, clojurescript, YAML, XML, etc.)

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

Dezvaluirea: Am scris mai bine nevoie.

Publicat 01/11/2012 la 16:06
sursa de către utilizator

voturi
1

Verificați acest proiect github de niutech, se poate converti codul typescript la codul JS pe zbor în browser - ul , dar cred că poate fi ușor modificat pentru a lucra în node.js.

Publicat 07/10/2012 la 07:41
sursa de către utilizator

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