A fork of the amazing Typewriter extension
TypewriterX is a hard fork of the amazing Typewriter extension by Fredrik Hagnelius
Typewriter works as a 1/1 mapper/template engine between a class and a single file, this was simple, but limiting.
I needed to parse code and generate multiple outputs, depending on complex conditions, something the Typewriter syntax doesn't support
I also needed more access to generic types (GenericDefClass
) and better ways to generalize my template (AsClass
,AsEnum
)
TypewriterX is backwards compatible with Typewriter, for new features it uses the .tstx extension
all the features in the original Typewriter are preserved (at version 1.20), with these changes:
RootContext
object, that allows access to all files,classes,enums etc in the solutionfile output
syntax to collections in the template, templates can generate any number of files and even nest them, see examplesType
can be converted to a Class
or an Enum
using the new AsClass
and AsEnum
properties.Class
generic definition using GenericDefClass
propertyBelow is an example of a TypeScript Template for generating simple model classes.
$Files(*Models)
will find files classes with a name ending in "Model" defined in the same project as the template
or in a project referenced by that project.
The section between the brackets ([]
) is repeated for each file.
$Classes will find all public classes in the file being processed, each class will be outputed to a file named between the arrows (<>
)
$Name
will print the name of the class and
$Properties
will loop each public property of the class.
$name
is the name of the property (by using the lower case
$name
the property name will be printed in camel case) and
$Type
is a TypeScript friendly version of the property type.
$Files(*Models)[ $Classes<$Name.ts>[ export class $Name { $Properties[ public $name : $Type; ] } ] ]
using System; using System.Collections.Generic; namespace Demo { public class CustomerModel { public int Id { get; set; } public string Name { get; set; } public ICollection<OrderModel> Orders { get; set; } } public class EmployerModel { public int Id { get; set; } public string Name { get; set; } } }
export class CustomerModel { public id: number; public name: string; public orders: OrderModel[]; }
export class EmployerModel { public id: number; public name: string; }