CodeBlanks Logo Icon CodeBlanks

Özet - Transformer

Transformer ile bir loglama enjektörü yazarsın.

Loglama enjektörü özeti

Bir loglama enjektörü transformer'ı üç parçayı birleştirir: ts.factory ile console.log(...) deyimi üretirsin, ts.transform ile bu transformer'ı kaynağa uygularsın, ts.createPrinter ile dönüştürülmüş kaynağı metne yazdırırsın. Enjektör kaynak dosyanın başına veya her fonksiyonun gövdesinin başına deyim ekleyebilir.

const result = ts.transform(sf, [transformer]);
const printer = ts.createPrinter();
process.stdout.write(printer.printFile(result.transformed[0]));

Uygulama Loglama enjektörü

const x = 1; kaynağından bir SourceFile oluştur. Bir transformer yaz: kaynak dosyanın başına console.log("called") deyimini ekle. ts.factory ile deyimi üret, ts.transform ile uygula, ts.createPrinter ile sonucu yazdır.

Başlangıç kodu

index.ts
import * as ts from "typescript";

// Kaynak: const x = 1;
// SourceFile oluştur
// Bir transformer yaz: kaynak dosyanın başına console.log("called") deyimi ekle
// transform ile uygula
// Printer ile sonucu yazdır

// kodunu buraya yaz

Örnek çözüm

index.ts
import ts from "typescript";

const sourceText = "const x = 1;";
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);

const transformer: ts.TransformerFactory<ts.SourceFile> = (context) => {
  return (node) => {
    const logStmt = ts.factory.createExpressionStatement(
      ts.factory.createCallExpression(
        ts.factory.createPropertyAccessExpression(
          ts.factory.createIdentifier("console"),
          ts.factory.createIdentifier("log")
        ),
        undefined,
        [ts.factory.createStringLiteral("called")]
      )
    );
    return ts.factory.updateSourceFile(node, [logStmt, ...node.statements]);
  };
};

const result = ts.transform(sf, [transformer]);
const printer = ts.createPrinter();
process.stdout.write(printer.printFile(result.transformed[0] as ts.SourceFile));
result.dispose();

Beklenen çıktı

console.log("called");
const x = 1;

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Loglama enjektörü için hangi üçlü bir araya gelir?

  • getSourceFile + getText + console.log
  • createSourceFile + JSON.stringify + writeFile
  • getTypeChecker + writeFile + readFile
  • ts.factory + ts.transform + ts.createPrinter Doğru cevap

Açıklama: ts.factory ile log deyimi üretirsin, ts.transform ile uygularsın, ts.createPrinter ile sonucu yazdırırsın. Üçü birlikte eksiksiz enjektör verir.

2 Printer oluştur

Soru
const result = ts.transform(sf, [transformer]);
const printer = ts.____;
Cevap
const result = ts.transform(sf, [transformer]);
const printer = ts.createPrinter();

Açıklama: ts.createPrinter() bir Printer nesnesi döndürür; createPrinter parantezsiz fonksiyonun kendisidir, newPrinter ve printer factory üzerinde yoktur.

3 Transformer özeti

Kavram Anlamı
ts.factory AST düğümü üretir
ts.transform Transformer'ı uygular
ts.createPrinter Düğümü metne yazar
visitEachChild Alt düğümleri dönüştürür

Uzman bölümündeki tüm dersler