Har Loggfila gi en eksplisitt Public API for NodeJS Module Access?

stemmer
11

Fra i en node app jeg ønsker å gjøre:

var typeScript = require('typescript'); 

typeScript.compile('...')

Jeg ønsker å implementere kompilatoren i en bygge systemet, men uten tilgang til et offentlig API (typescript.compile, etc) dette er umulig.

Her er en mer komplett eksempel på hva jeg ønsker å gjøre, selv om under er for LiveScript, ikke maskinskrevet manuskript, utilitized i en plugin skrevet for Brunch.io bygge-system:

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')
  ]

Nysgjerrig på om noen har funnet en work-around?

Oppdater

Jeg endte opp med å implementere min egen løsning på en rekke av de problemene som er nevnt ovenfor og andre steder. Vennligst se https://github.com/damassi/TypeScript-Watcher for mer informasjon og bruk.

Publisert på 03/10/2012 klokken 21:40
kilden bruker
På andre språk...                            


5 svar

stemmer
8

Dette er litt Hacky men det vil fungere.

Jeg tenkte på denne samme i går, og jeg skulle sjekke koden sin. Hvis du sjekker bin / typscript.js fra deres kildekode (Det er en veldig veldig stor fil, med nesten 21k linjer med kode), vil du se det skaper TypeScript.TypeScriptCompiler, og da vil du finne at dette ikke utsetter en måte å kompilere .

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

Nå trenger du en enkel måte å avsløre det. For å gjøre dette, må du endre koden sin, og det er derfor dette er Hacky. For å gjøre dette, kan du endre typescript.js ved å legge til:

module.exports = exports = TypeScript;

Helt på slutten av filen.

Deretter kan du opprette en index.js fil i roten av modulen (varsel: installere modulen i en lokal omfang for alt dette: "NPM installere Loggfila"), som eksponerer objektet.

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

Og klar! Nå kan du bare kalle det og kompilere koden ved å bruke det. Du kan sjekke hvordan du bruker API for kompilering i tsc.js filen.

Jeg beklager på forhånd for fryktelig kode fremover:

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

Av en eller annen grunn den som skrev koden var en ekte fan av C # og fortsatte å gå videre og bruker metoder kalt Writeline, Lukk og skrive, som faktisk bare wrappers. Du kan få dette av overhead for å måtte legge dette fungerer, men du må endre mye kode i modulen, og det er ikke verdt det. Jeg tror det er best å ha en klasse for å forlenge (eller hvis du fortsatt er på JS, arve prototype) og la den gjøre det for deg, for å gjøre den tørr.

Noe veldig hyggelig er at hvis du ønsker å oversette 500 Loggfila filer og sette dem alle i én JS-fil, kan du bare ringe compiler.addUnit (anothercontent, anotherpath); 500 ganger og deretter se det hele gå inn i en enkelt fil :)

Med fokus på bedre ting: hvis du sjekker tsc.js kode, vil du finne en batch kompilator klasse. Hvis du ønsker dette for et byggeprosessen, kan det være bedre å bruke noe mer robust som det. Det gir se filer og mer.

Etter å ha bladd koden, jeg tror jeg vil bare sende en billett til utviklingsteamet og be dem om å gi en klarere API ¬¬

Merk: Alle fil leser her er gjort i en synkron måte. Dette er dårlig, veldig dårlig, med tanke på ytelse. Jeg vet ikke nøyaktig hva du har tenkt å gjøre, men jeg kunne ikke anbefale mer at du finner en måte å gjøre dette async hvis mulig.

Svarte 03/10/2012 kl. 22:52
kilden bruker

stemmer
2

Foreløpig er det ikke mulig å oppnå en samling bare ved å ha et behov og ringer kompilere. Hvis du kan se på harness.ts det er en kompilator modul som gir en ganske enkel måte å gjøre det, men jeg foreslår at du kan ringe TSC eksternt.

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

Jeg tror dette ville gjøre jobben.

Svarte 03/10/2012 kl. 22:01
kilden bruker

stemmer
1

Du kan prøve ut https://github.com/sinclairzx81/typescript.api . Dette prosjektet gjør require () forlengelse ting, men har også noen funksjonalitet for å kompilere ts kilde manuelt. Det bør være mulig å opprette en automatisert build system med det.

oppmerksom tho sin bygd på Loggfila 0,9 kompilatoren, slik at du kan eller ikke kan ha suksess kompilering 0.8.3 kilde gitt ulike oppdateringer til språket.

Svarte 13/05/2013 kl. 11:03
kilden bruker

stemmer
1

bedre kreve kunne hjelpe deg å oppnå dette hvis alt du ønsker er å utføre / tilgang til loggfila.

Den lar deg require () Loggfila filer - ingen pre-kompilering nødvendig - og en haug med andre filformater (coffeescript, clojurescript, YAML, xml, etc.)

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

Disclosure: Jeg skrev bedre trenger.

Svarte 01/11/2012 kl. 15:06
kilden bruker

stemmer
1

Sjekk denne github prosjektet ved niutech, det kan konvertere script-kode for å JS kode på fly i nettleseren , men jeg antar det kan lett endres til å arbeide i node.js.

Svarte 07/10/2012 kl. 06:41
kilden bruker

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