Búsqueda de sitios web

node.js - ¿cómo usar require('typescript').transform?


const ts = require('typescript');

let template = `
         let hello: string = 'hello,world';
`
ts.transform

¿Cómo convertir cadenas en la operación anterior?

Respuesta #1

Puedes usar la función transpile. Esto te permitirá compilar una cadena arbitraria:

import * as typescript from 'typescript';  

let template = `
         let hello: string = 'hello,world';
         class test{}
`
let errors : typescript.Diagnostic[] = []
let result = typescript.transpile(template, {}, undefined, errors);

// The result
console.log(result);
// The erorrs
for(let err of errors) console.log(err.messageText);

Editar

La solución anterior funciona, pero solo verifica errores sintácticos, no errores semánticos. Una versión que realiza la resolución de módulos y verificará errores semánticos sería:

function transpileWithAllErrors(input: string, compilerOptions?: typescript.CompilerOptions, fileName: string = "dynamic.ts", diagnostics?: typescript.Diagnostic[]): string {
    let result: string;
    let host = typescript.createCompilerHost({});
    let sourceFile = typescript.createSourceFile(fileName, template, typescript.ScriptTarget.ES5);
    let orginalGetSourceFile = host.getSourceFile;
    host.getSourceFile = (file, languageVersion, onError, shouldCreateNewSourceFile) =>
        file == fileName ?
            sourceFile :
            orginalGetSourceFile(file, languageVersion, onError, shouldCreateNewSourceFile);

    host.getCurrentDirectory = () => "";
    host.getDefaultLibLocation = () => "node_modules/typescript/lib";
    host.getDefaultLibFileName = () => "node_modules/typescript/lib/lib.d.ts";

    let program = typescript.createProgram([fileName], {}, host);

    // Capture output, 
    host.writeFile = (wFileName, data) =>{ 
        if(wFileName.endsWith(".js")) {
            result = data;
        }
    };

    if (diagnostics != null) {
        diagnostics.push(...program.getSyntacticDiagnostics(sourceFile));
        diagnostics.push(...program.getSemanticDiagnostics(sourceFile));
        diagnostics.push(...program.getOptionsDiagnostics());
    }
    program.emit(sourceFile);
    return result;
}

Uso :

let diagnostics: typescript.Diagnostic[] = []
let result = transpileWithAllErrors(template, {}, undefined, diagnostics);
for (let err of diagnostics) console.log(err.messageText);
console.log(result);

Nota: Este método hace la resolución de módulos relativa a la ruta actual, por lo que el script tiene acceso a cualquier módulo instalado en la ruta actual. Además, no realicé pruebas extensas en el código, pero debería funcionar.