Celui-ci est un peu hacky mais il fonctionnera.
Je pensais à ce même hier, et je juste vérifiais leur code. Si vous cochez bin / typscript.js de leur code source (Il est un fichier très très grand, avec près de 21k lignes de code), vous verrez qu'il crée TypeScript.TypeScriptCompiler, et vous constaterez que ce n'expose une façon de compiler .
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
Maintenant, vous devez un moyen facile de l'exposer. Pour ce faire, vous devrez modifier leur code, ce qui est pourquoi est-ce aki. Pour ce faire, vous pouvez modifier typescript.js en ajoutant:
module.exports = exports = TypeScript;
Juste à la fin du fichier.
Ensuite, vous pouvez créer un fichier index.js dans la racine du module (avis: installer le module dans un cadre local pour tout cela: « installer NPM tapuscrit »), qui expose l'objet.
exports.TypeScript = require("bin/typescript");
Et prêt! Maintenant, vous pouvez simplement l'appeler et compiler votre code à l'utiliser. Vous pouvez vérifier comment utiliser l'API pour la compilation dans le fichier tsc.js.
Je présente mes excuses à l'avance pour le code horribles avant:
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();
Pour une raison quelconque celui qui a écrit le code était un vrai fan de C # et a procédé à aller de l'avant et les méthodes d'utilisation appelé WriteLine, Fermer et écriture, qui sont en fait que des emballages. Vous pouvez obtenir ce des frais généraux d'avoir à ajouter cette fonction, mais vous devez modifier beaucoup de code dans le module et il est pas la peine. Je pense qu'il est préférable d'avoir une classe d'étendre (ou si vous êtes toujours sur JS, héritez le prototype) et laissez-le faire pour vous, pour le faire sécher.
Quelque chose de vraiment agréable est que si vous voulez traduire 500 fichiers tapuscrit et les mettre tous dans un seul fichier .js, vous pouvez simplement appeler compiler.addUnit (anothercontent, anotherpath); 500 fois, puis voir tout aller dans un seul fichier :)
En se concentrant sur les choses mieux: si vous vérifiez tsc.js code, vous trouverez une classe de compilateur par lots. Si vous voulez que cela pour un processus de construction, il pourrait être préférable d'utiliser quelque chose de plus robuste comme ça. Il fournit à regarder des fichiers et plus.
Après avoir parcouru le code, je pense que je vais soumettre un ticket à l'équipe de développement et leur demander de fournir une API plus claire ¬¬
Remarque: Tous les fichiers se lit ici sont faites de manière synchrone. Ceci est mauvais, très mauvais, en termes de performance. Je ne sais pas exactement ce que vous envisagez de faire, mais je ne pouvais pas recommander plus que vous trouverez un moyen de faire ce async si possible.