The framework, while using typescript
, has need of some extended functionality. The additional functionality is
- Supports on-the-fly compilation, nothing needs to be compiled ahead of time
- Enhanced AST transformations, and transformer registration
- All AST transformations are single-file based, and runs without access to the
TypeChecker
- All AST transformations are single-file based, and runs without access to the
- Intelligent caching of source files to minimize recompilation
- Support for watching sources files:
- Detecting changes to files
- Detecting changes to specific classes
- Detecting changes to specific methods within classes
- Allows for hot-reloading of classes during development
- Utilizes
es2015
Proxy
s to allow for swapping out implementation at runtime
- Utilizes
Additionally, there is support for common AST transformation patterns to facilitate all the transformers used throughout the framework. Functionality includes:
getDecoratorIdent(d: ts.Decorator): ts.Identifier
Gets the name of the decorator functionfindAnyDecorator(node: ts.Node, patterns: { [key: string]: Set<string> }, state: State): ts.Decorator | undefined
Attempts to find any matching decorators as defined in patternsaddImport(file: ts.SourceFile, imports: Import[])
Will add an import to the existing source filefromLiteral(val: any)
Converts a literal value to the corresponding AST nodesextendObjectLiteral(addTo: object, lit?: ts.ObjectLiteralExpression)
Extends an AST Node via a literal value, generally used to emulateObject.assign
in the ASTgetPrimaryArgument<T = ts.Node>(node: ts.CallExpression | ts.Decorator | undefined): T | undefined
Retrieves the first argument of CallExpression or DecoratorgetObjectValue(node: ts.ObjectLiteralExpression | undefined, key: string)
Extracts the literal value from an AST node if possibleimportingVisitor
Provides a transformer visitor that collects imports, and adds them to the source file as neededimportIfExternal<T extends State>(typeNode: ts.TypeNode, state: State)
Will import a reference if the type is not defined within the filebuildImportAliasMap(pathToType)
Will generate an import lookup to be used for simple type resolution
Transformations are defined by support/transformation.<name>.ts
as the filename. The schema for a transformer is
export class CustomerTransformer {
priority: 1, // Lower is higher priority
phase: 'before'|'after', // The phase as defined by Typescript's AST processing
transformer: (context: ts.TransformationContext) => {
return (file: ts.SourceFile) => {
... modify source file ...
return file;
}
}
}