Is Typescript bieden een expliciete Public API voor NodeJS Module Access?

stemmen
11

Vanuit een knooppunt app zou ik willen doen:

var typeScript = require('typescript'); 

typeScript.compile('...')

Ik ben op zoek naar de compiler uit te voeren in een systeem te bouwen, maar zonder toegang tot een openbaar API (typescript.compile, etc) dat is onmogelijk.

Hier is een meer complete voorbeeld van wat ik zou willen doen, hoewel de hieronder is alleen voor LiveScript, niet typoscript, utilitized in een plugin geschreven voor de build-systeem 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')
  ]

Nieuwsgierig als iemand vond een work-around?

Bijwerken

Uiteindelijk heb ik de uitvoering van mijn eigen oplossing voor een verscheidenheid van het bovenstaande en elders genoteerd problemen. Zie https://github.com/damassi/TypeScript-Watcher voor meer informatie en gebruik.

De vraag is gesteld op 03/10/2012 om 22:40
bron van user
In andere talen...                            


5 antwoorden

stemmen
8

Deze is een beetje hacky, maar het zal werken.

Ik dacht na over deze zelfde gisteren en ik was hun code te controleren. Als u bin / typscript.js controleren vanuit hun broncode (Het is een zeer groot bestand, met bijna 21K regels code), ziet u het creëert TypeScript.TypeScriptCompiler, en dan zul je merken dat dit bloot een manier van het samenstellen .

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

Nu, een gemakkelijke manier om het te bloot nodig. Om dit te doen, moet je hun code, dat is waarom dit hacky wijzigen. Om dit te doen, kan je typescript.js wijzigen door het toevoegen:

module.exports = exports = TypeScript;

Helemaal aan het einde van het bestand.

Vervolgens kunt u een index.js bestand in de root van de module te maken (let op: installeer de module in een lokale scope voor dit alles: "NPM installeren typoscript"), die het voorwerp bloot.

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

En klaar! Nu kun je gewoon bellen het en compileren uw code te gebruiken. U kunt controleren hoe u de API gebruiken voor het samenstellen in de tsc.js bestand.

Ik verontschuldig me bij voorbaat voor de verschrikkelijke code vooruit:

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

Om een ​​of andere reden wie schreef de code was een echte fan van C # en ging om verder te gaan en te gebruiken methoden genoemd WriteLine, Close en schrijven, die in feite gewoon wrappers. Je kon dit te krijgen van de overhead van het hebben van deze functies toe te voegen, maar je zou hebben om veel van de code te wijzigen in de module en het is niet de moeite waard. Ik denk dat het het beste om een ​​klasse uit te breiden (of als je nog op JS, erven het prototype) en laat hem dat voor je doen, om het droog te maken.

Iets wat echt leuk is dat als je wilt 500 typoscript bestanden vertalen en zet ze allemaal in een enkel .js bestand, kunt u gewoon bellen compiler.addUnit (anothercontent, anotherpath); 500 keer en dan zien het allemaal gaan in een enkel bestand :)

Gericht op betere dingen: als je tsc.js code te controleren, vindt u een batch compiler de klas. Als u deze wilt gebruiken voor een bouwproces, is het misschien beter om iets robuuster als het te gebruiken. Het voorziet kijken bestanden en nog veel meer.

Nadat de code gebladerd, ik denk dat ik zal gewoon een ticket voor de ontwikkeling team en hen vragen om een ​​duidelijker API bieden ¬¬

Opmerking: Alle bestanden leest hier worden gedaan in een synchrone manier. Dit is slecht, heel slecht, in termen van prestaties. Ik weet niet precies wat je van plan te doen, maar ik kon niet meer dat je een manier om dit asynchrone maken als mogelijk te adviseren.

antwoordde op 03/10/2012 om 23:52
bron van user

stemmen
2

Op dit moment is het niet mogelijk om een ​​compilatie te bereiken door gewoon even nodig hebben en roepen samen te stellen. Als je kunt kijken naar de harness.ts is er een compiler module die een vrij eenvoudige manier van doen biedt, maar ik zou je aanraden om extern TSC bellen.

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

Ik denk dat dit zou het werk doen.

antwoordde op 03/10/2012 om 23:01
bron van user

stemmen
1

Je zou kunnen proberen https://github.com/sinclairzx81/typescript.api . Dit project heeft de require () uitbreiding dingen, maar heeft ook een aantal functies om ts bron handmatig samen te stellen. Het moet mogelijk zijn om een geautomatiseerd systeem te bouwen te maken met het.

Let tho zijn gebouwd op het typoscript 0,9 compiler, dus je kan wel of niet succesvol compileren van 0.8.3 source krijgen verschillende updates om de taal te hebben.

antwoordde op 13/05/2013 om 12:03
bron van user

stemmen
1

beter vereisen kan helpen dit te bereiken als je alleen uitvoert / toegang tot het logbestand.

Het laat je require () typescript bestanden - geen pre-compilatie nodig - en een heleboel andere bestandsformaten (coffeescript, clojurescript, YAML, xml, enz.)

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

Disclosure: Ik schreef beter vereisen.

antwoordde op 01/11/2012 om 16:06
bron van user

stemmen
1

Controleer deze GitHub project door niutech, kan Typescript code converteren naar JS code on the fly in de browser , maar ik denk dat het kan eenvoudig worden aangepast worden om te werken in node.js.

antwoordde op 07/10/2012 om 07:41
bron van user

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