javascript - Transpiler TypeScript i minnet med Node


Finnes det en måte å transpile TypeScript i minnet med Node på? Jeg vil gjerne kunne få den genererte JavaScripten i minnet.

Svar #1

Ja. TypeScript tilbyr en ts.transpileModule-funksjon:

const ts = require('typescript');
const source = "let x: string  = 'hello world'";
const result = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS }});
console.log(result.outputText); // var x = 'hello world';

Mer

  • Fra TypeScript-wikien: https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API#a-simple-transform-function

Svar #2

Vi endte opp med å utvikle vår egen løsning basert på den innebygde TypeScript transpileModule-funksjonaliteten.

FRA TYPESCRIPT-DOKUMENTER

TranspileModule vil kompilere kildetekst fra 'input'-argumentet ved bruk av spesifiserte kompilatoralternativer. Hvis ingen alternativer blir gitt, vil det bruke et sett med standard kompilatoralternativer. Ekstra kompilatoralternativer som vil bli brukt ubetinget av denne funksjonen er:

  • isolatedModules=true
  • allowNonTsExtensions=true
  • noLib=true
  • noResolve=true

transpile() - Denne koden vil transpile TypeScript til JavaScript (typescriptServices.min.js fra TypeScript er nødvendig):

export function transpile(tscode: string): TYPE.EVENT {

    interface TranspileOptions {
        compilerOptions?: any
        fileName?: string;
        reportDiagnostics?: boolean;
        moduleName?: string;
        renamedDependencies?: any;
    }

    interface TranspileOutput {
        outputText: string;
        diagnostics?: any[];
        sourceMapText?: string;
    }

    let compilerOptions: ts.CompilerOptions = {
        isolatedModules: false
    }

    let options: TranspileOptions = {
        compilerOptions: compilerOptions,
        reportDiagnostics: true
        // moduleName: modulename
    }

    let info: TYPE.EVENT;

    try {

        // Transpile the ts code to js.
        let ret: TranspileOutput = ts.transpileModule(tscode, options);

        // If diagnostics were returned.
        // NOTE: The transpiler is currently always return a message (code=5047) about 'isolatedModules', which
        // is not relavent for our use. If there is more than one row than there is in fact an error.
        if (ret.diagnostics && ret.diagnostics.length > 0) {

            let code = ret.diagnostics[0].code;

            if (code == 5047) {
                return (info = {
                    success: true,
                    returnvalue: ret.outputText,
                    caller: LibCore.getFunctionName(arguments)
                })
            } else {

                let text = ret.diagnostics[0].messageText;
                // let hint = ret.diagnostics[0].file.parseDiagnostics[0].file.nextContainer.symbol.name;

                return (info = {
                    success: false,
                    returnvalue: ret.diagnostics,
                    message: `Syntax error: ${text} Code: ${code}`,
                    caller: LibCore.getFunctionName(arguments)
                })
            }

        } else {
            return (info = {
                success: true,
                returnvalue: ret.outputText,
                caller: LibCore.getFunctionName(arguments)
            })
        }

    } catch (e) {
        return (info = {
            success: false,
            message: e.message,
            caller: LibCore.getFunctionName(arguments)
        })
    }
} 

Relaterte artikler