Mecanografiado no proporciona una API pública explícita para NodeJS módulo de acceso?

votos
11

Desde dentro de una aplicación de nodo me gustaría hacer:

var typeScript = require('typescript'); 

typeScript.compile('...')

Estoy mirando para poner en práctica el compilador en un sistema de construcción, pero que no tienen acceso a una API pública (typescript.compile, etc) esto es imposible.

Aquí está un ejemplo más completo de lo que me gustaría hacer, sin embargo el siguiente es para LiveScript, no mecanografiado, utilitized en un plugin escrito para el sistema de acumulación de 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')
  ]

Curiosidad por si alguien encuentra una solución alternativa?

Actualizar

Terminé la implementación de mi propia solución a una variedad de los problemas enumerados anteriormente y en otros lugares. Por favor, vea https://github.com/damassi/TypeScript-Watcher para obtener más información y su uso.

Publicado el 03/10/2012 a las 22:40
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
8

Éste es un poco hacky pero funcionará.

Pensé en este mismo ayer y yo estaba revisando su código. Si marca bin / typscript.js de su código fuente (Es un archivo muy muy grande, con casi 21k líneas de código), verá que crea TypeScript.TypeScriptCompiler, y luego se dará cuenta de que esto no exponer una forma de compilar .

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

Ahora, necesita una manera fácil de exponerlo. Para ello, tendrá que modificar su código, por lo que este es hacky. Para ello, podría modificar typescript.js añadiendo:

module.exports = exports = TypeScript;

Justo al final del archivo.

A continuación, puede crear un archivo de index.js en la raíz del módulo (aviso: instalar el módulo en un ámbito local para todo esto: "NGP instalar mecanografiado"), que expone el objeto.

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

¡Y listo! Ahora sólo se puede llamar y compilar el código de usarlo. Puede comprobar cómo utilizar la API para la compilación en el archivo tsc.js.

Me disculpo de antemano por el código horrible, por delante:

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

Por alguna razón el que escribió el código fue un verdadero fan de C # y procedió a seguir adelante y métodos de uso de llama WriteLine, Cerrar y escritura, que son, de hecho, sólo las envolturas. Se podría conseguir este de la sobrecarga de tener que añadir estas funciones, pero que tendría que modificar una gran cantidad de código en el módulo y que no vale la pena. Creo que lo mejor es tener una clase para extender (o si usted todavía está en JS, heredad el prototipo) y deja que haga eso por ti, para que se seque.

Algo muy interesante es que si quieres traducir 500 archivos de texto mecanografiado y poner a todos en un solo archivo .js, que sólo puede llamar compiler.addUnit (anothercontent, anotherpath); 500 veces y luego ver que todos van en un solo archivo :)

Centrándose en mejores cosas: si marca tsc.js código, se encuentra una clase de lote compilador. Si desea que esta para un proceso de construcción, tal vez sería mejor usar algo más robusto como él. Proporciona archivos de observación y más.

Después de haber navegado por el código, creo que sólo voy a enviar un ticket al equipo de desarrollo y pedirles que aporten una API más claro ¬¬

Nota: Todos los archivos se lee aquí se hace de una manera sincrónica. Esto es malo, muy malo, en términos de rendimiento. No sé exactamente lo que va a hacer, pero no podía recomendar más que encontrar una manera de hacer este asíncrono, si es posible.

Respondida el 03/10/2012 a las 23:52
fuente por usuario

votos
2

Actualmente no es posible lograr una compilación sólo por tener un requieren y llamar a compilar. Si se puede ver en las harness.ts hay un módulo compilador que proporciona una manera más sencilla de hacerlo pero sugeriría que llame TSC externamente.

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

Creo que esto haría el trabajo.

Respondida el 03/10/2012 a las 23:01
fuente por usuario

votos
1

Usted puede probar https://github.com/sinclairzx81/typescript.api . Este proyecto hace las cosas extensión require (), pero también tiene algunas funciones para compilar ts fuente manualmente. Debe ser posible crear un sistema automático de generación con él.

aunque tenga en cuenta su base en el compilador mecanografiado 0,9, por lo que puede o no puede tener éxito la compilación de código 0.8.3 dado varios cambios a la lengua.

Respondida el 13/05/2013 a las 12:03
fuente por usuario

votos
1

mejor necesita podría ayudar a lograr esto si lo que quieres está ejecutando / acceder al fichero de transcripción.

Le permite require () archivos mecanografiado - sin pre-compilación necesario - y un montón de otros formatos de archivo (CoffeeScript, clojurescript, YAML, XML, etc.)

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

Divulgación: Escribí mejor requiere.

Respondida el 01/11/2012 a las 16:06
fuente por usuario

votos
1

Compruebe este proyecto github por niutech, se puede convertir el código de transcripción de código JS sobre la marcha en el navegador , pero creo que puede ser fácilmente modificado para que funcione en node.js.

Respondida el 07/10/2012 a las 07:41
fuente por usuario

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