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