Tapuscrit ne fournit une API publique explicite pour NodeJS Module d'accès?

voix
11

À partir d'une application de nœud que je voudrais faire:

var typeScript = require('typescript'); 

typeScript.compile('...')

Je cherche à mettre en œuvre le compilateur dans un système de construction, mais sans accès à une API publique (typescript.compile, etc.) cela est impossible.

Voici un exemple plus complet de ce que je voudrais faire, bien que le dessous est à LiveScript, non tapuscrit, utilitized dans un plug-in écrit pour la construction du système 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')
  ]

Curieux de savoir si quelqu'un a trouvé un travail autour?

Mettre à jour

J'ai fini par mettre en œuvre ma propre solution à divers problèmes énumérés ci - dessus et ailleurs. S'il vous plaît voir https://github.com/damassi/TypeScript-Watcher pour plus d' informations et d' utilisation.

Créé 03/10/2012 à 22:40
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
8

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.

Créé 03/10/2012 à 23:52
source utilisateur

voix
2

À l'heure actuelle, il est impossible de réaliser une compilation juste en ayant un besoin et d'appeler la compilation. Si vous pouvez regarder les harness.ts il y a un module de compilateur qui fournit un moyen assez simple de le faire, mais je vous suggère d'appeler tsc externe.

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

Je crois que ce serait faire le travail.

Créé 03/10/2012 à 23:01
source utilisateur

voix
1

Vous pourriez essayer https://github.com/sinclairzx81/typescript.api . Ce projet fait l'require () substance d'extension, mais il a aussi quelques fonctionnalités de compiler manuellement la source ts. Il devrait être possible de créer un système automatisé de construction avec elle.

noter tho son construit sur le tapuscrit 0,9 compilateur, de sorte que vous pouvez ou ne pouvez pas avoir du succès compilation 0.8.3 sources diverses données mises à jour de la langue.

Créé 13/05/2013 à 12:03
source utilisateur

voix
1

mieux besoin pourrait vous aider à atteindre cet objectif si tout ce que vous voulez est en cours d' exécution / l' accès au fichier dactylographiée.

Il vous permet de require () fichiers dactylographiées - pas de pré-compilation nécessaire - et un tas d'autres formats de fichiers (coffeescript, clojurescript, YAML, XML, etc.)

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

Divulgation: J'ai écrit mieux besoin.

Créé 01/11/2012 à 16:06
source utilisateur

voix
1

Vérifiez ce projet github par niutech, il peut convertir le code tapuscrit au code JS à la volée dans le navigateur , mais je suppose que ce peut être modifié facilement pour travailler dans Node.js.

Créé 07/10/2012 à 07:41
source utilisateur

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