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:

  1. Hvordan opretter man et AST-fragment fra en streng?
  2. 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);

Relaterede artikler