Printing TypeScript code from AST

This wiki section of TypeScript github project covers how to print an AST (Abstract Syntax Tree) node, but it does not cover how to update and print an entire file (at the time of writing this post).

After a lot of trial and error, I came up with the following. I don’t know whether its the right way to do it but it works:

import ts from 'typescript';

// Create a Printer
const printer = ts.createPrinter({
    newLine: ts.NewLineKind.LineFeed,
    removeComments: false,
    omitTrailingSemicolon: true
});

// Create a source file
const sourceFile = ts.createSourceFile(
    'someFileName.ts',
    '',
    ts.ScriptTarget.Latest,
    /*setParentNodes*/ false,
    ts.ScriptKind.TS
);

const myASTNode_1 = /* Your AST */;
const myASTNode_2 = /* Your AST */;
const myASTNode_3 = /* Your AST */;
// etc

// Update the source file statements
sourceFile.statements = ts.createNodeArray(
    [ myASTNode_1, myASTNode_2, myASTNode_3, .... ]
);

// Print the new code
console.log(printer.printFile(sourceFile));

So first we create a ts.Printer object and an empty ts.SourceFile. The code in a SourceFile is located in the statements key which is of type ts.NodeArray. Hence, we use the ts.createNodeArray function to generate ts.NodeArray and replace the statements.

I’ve created a small example here. You can clone it and try for yourselves.

git clone https://gist.github.com/vkbansal/379460892f12e0b8bb50434e52e6368f ts-ast
cd ts-ast
yarn install # or npm install
yarn start # or npm start

It should look something like this:

command

typescriptast