Questo è un po 'hacky ma funzionerà.
Ho pensato a questo stesso proprio ieri e stavo controllando il loro codice. Se si seleziona bin / typscript.js dal loro codice sorgente (Si tratta di un file molto grande, con quasi 21k righe di codice), si vedrà crea TypeScript.TypeScriptCompiler, e allora vi accorgerete che questo non esporre un modo di compilazione .
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
Ora, è necessario un modo semplice per esporlo. Per fare questo, sarà necessario modificare il loro codice, che è il motivo per cui questo è hacky. Per fare questo, è possibile modificare typescript.js con l'aggiunta di:
module.exports = exports = TypeScript;
Proprio alla fine del file.
Quindi, è possibile creare un file index.js nella radice del modulo (avviso: installare il modulo in un ambito locale per tutto questo: "NPM installare dattiloscritto"), che espone l'oggetto.
exports.TypeScript = require("bin/typescript");
E pronto! Ora si può solo chiamare e compilare il codice di utilizzarlo. È possibile controllare come utilizzare l'API per la compilazione nel file tsc.js.
Mi scuso in anticipo per il codice orribile avanti:
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();
Per qualche ragione chi ha scritto il codice è stato un vero fan di C # e ha proceduto ad andare avanti e di utilizzare metodi chiama WriteLine, Close e scrittura, che sono in realtà solo involucri. Si potrebbe ottenere questo del sovraccarico di dover aggiungere queste funzioni, ma si dovrà modificare un sacco di codice nel modulo e non è valsa la pena. Penso che è meglio avere una classe di estendere (o se siete ancora in JS, ereditano il prototipo) e lasciar fare per voi, per fare asciugare.
Qualcosa di veramente bello è che se si desidera tradurre 500 file dattiloscritto e metterli tutti in un unico file .js, si può chiamare compiler.addUnit (anothercontent, anotherpath); 500 volte e poi vedere andare tutto in un unico file :)
Concentrandosi su cose meglio: se controlli tsc.js codice, si trova una classe del compilatore batch. Se si desidera che questo per un processo di compilazione, potrebbe essere meglio usare qualcosa di più robusto simile. Esso fornisce i file guardare e altro ancora.
Dopo aver sfogliato il codice, penso che mi limiterò a presentare un biglietto per il team di sviluppo e chiedere loro di fornire un'API chiara ¬¬
Nota: Tutti i file di legge qui sono fatte in modo sincrono. Questo è male, molto male, in termini di prestazioni. Non so esattamente che cosa avete intenzione di fare, ma non potrei raccomandare più che trovare un modo per rendere questo asincrona, se possibile.