TypeScript compiler wrapper. Provides a simple way to navigate and manipulate the TypeScript AST.
- Most AST navigation is implemented, but still some missing. This library can be used to help you easily navigate the TypeScript compiler's AST.
- Code manipulation/generation is making steady progress and is somewhat useable at this point. There's still lots to do.
ts-simple-ast adds a layer over the compiler while still providing access to the underlying TypeScript compiler AST.
- Simple Layer - Provides a simple way for navigating and manipulating the AST.
- Compiler Layer - TypeScript compiler objects.
Changes made in the simple layer will be made to the underlying compiler layer.
Work in progress: https://dsherret.github.io/ts-simple-ast/
import Ast from "ts-simple-ast";
// add source files to ast
const ast = new Ast();
const sourceFile = ast.addSourceFileFromText("MyFile.ts", "enum MyEnum {}\nlet myEnum: MyEnum;\nexport default MyEnum;");
ast.addSourceFiles("folder/**/*{.d.ts,.ts}");
ast.addSourceFiles("otherFolder/file.ts", "specifyAnotherFile.ts", "orAnotherGlob/**/*.ts");
ast.addSourceFile("misc.ts", {
classes: [{
name: "MyClass",
isExported: true
}],
enums: [{
name: "MyEnum",
isExported: true,
members: [{ name: "member" }]
}]
});
// get information from ast
const enumDeclaration = sourceFile.getEnum("MyEnum")!;
enumDeclaration.getName(); // returns: "MyEnum"
enumDeclaration.hasExportKeyword(); // returns: false
enumDeclaration.isDefaultExport(); // returns: true
// manipulate ast
enumDeclaration.rename("NewName");
enumDeclaration.addMember({
name: "myNewMember"
});
enumDeclaration.setIsDefaultExport(false);
// result
sourceFile.getFullText(); // returns: "enum NewName {\n myNewMember\n}\nlet myEnum: NewName;"
sourceFile.save(); // save it to MyFile.ts
// get underlying compiler node from the typescript AST from any node
const sourceFileCompilerNode = sourceFile.node;
Or navigate existing compiler nodes created outside this library:
import * as ts from "typescript";
import {createWrappedNode, ClassDeclaration} from "ts-simple-ast";
// some code that creates a class declaration (could be any kind of ts.Node)
const classNode: ts.ClassDeclaration = ...;
// create and use a wrapped node
const classDec = createWrappedNode(classNode) as ClassDeclaration;
const firstProperty = classDec.getProperties()[0];
// ... do more stuff here ...