Indsæt vilkårlig tekst og ændr NodeArrays i TypeScript-kompilatorens API
// Input
class Foo {
templateString = 'some value';
}
// Output
import __LIB__ from '@scope/lib/path/to/lib';
class Foo {
templateString = (function compiledTemplate(deps) {
// ...
return result;
})({lib: __LIB__});
}
Faktisk har jeg to spørgsmål:
- Hvordan opretter man et AST-fragment fra en streng?
- Hvordan tilføjer man import?
P.S. Jeg prøvede forskellige metoder createSourceFile og ts.createImportDeclaration, men de førte alle til denne eller hin fejl: [
Svar #1
For at tilføje vilkårlig tekst er den bedste måde, jeg kender, at bruge createIdentifier med den streng, du vil indsætte.
For at tilføje en import-sætning, husk at du opdaterer træet uden at ændre det originale.
API'en ts.visitEachChild tager en nodesVisitor-parameter, som arbejder specielt på NodeArrays. Normalt, hvis du ikke sender en nodesVisitor med, vil den arbejde på hver Node i NodeArray ved hjælp af den første callback, du sender ind for visitor-parameteren, men her ønsker du specielt at arbejde på hele node-arrayet.
I dit tilfælde er du interesseret i en SourceFile's udtalelser (som er en NodeArray<Statement>). Du kan oprette importen med createImportDeclaration og opdatere SourceFile ved at indsætte en nodesVisitor som følger:
function addImport(statements: ts.NodeArray<ts.Statement>) {
const importStatement = ts.createImportStatement(/*...*/);
return ts.createNodeArray([importStatement, ...statements]);
}
visitEachChild(
sourceFile,
/*replace this with something that controls traversal*/ x => x,
context,
addImport);
