TypeScript CodeDOM
$ dotnet add package Fonlow.TypeScriptCodeDomCoreCodeDOM in .NET (Framework) has come with 3 providers:
While JSCriptCodeProvider is good enough for generating JavaScript codes for Internet Explorer however IE had been discontinued. TypeScriptCodeProvider provides extra benefits over "JavaScript Provider" through generating TypeScript codes:
Nuget package:

TypeScript CodeDOM is for code generators that use CodeDOM over template, for example, Fonlow.Poco2TS that reads an assembly with POCO classes, and WebApiClientGen that reads assemblies and the run time type info of a running Web API, and then create Code DOM that could be used to generate C# and TypeScript codes.
There are scenarios that Roslyn and template may provide more powerful features that you want and help you to write less codes with simpler design when developing the code generators.
CodeDOM covers almost every essential C# language features, however, not every features of such coverage is applicable to TypeScript.
bool ICodeGenerator.Supports(GeneratorSupport supports)
{
return (supports & supported) != 0;
}
const GeneratorSupport supported = GeneratorSupport.ArraysOfArrays
| GeneratorSupport.MultidimensionalArrays
| GeneratorSupport.TryCatchStatements
| GeneratorSupport.DeclareValueTypes
| GeneratorSupport.DeclareEnums
| GeneratorSupport.StaticConstructors
| GeneratorSupport.DeclareInterfaces
| GeneratorSupport.DeclareDelegates
| GeneratorSupport.NestedTypes
| GeneratorSupport.MultipleInterfaceMembers
| GeneratorSupport.ComplexExpressions
| GeneratorSupport.GenericTypeReference
| GeneratorSupport.GenericTypeDeclaration
;
Most supported classes are covered by unit testing, while some are covered by integration testing in some code generator projects, marked as "Indirectly" in the table below.
| Class | Unit Tests |
|---|---|
| CodeArgumentReferenceExpression | TestCodeArgumentReferenceExpression |
| CodeArrayCreateExpression | TestCodeArrayCreateExpression* |
| CodeArrayIndexerExpression | TestCodeArrayIndexerExpression* |
| CodeAssignStatement | TestCodeAssignStatement |
| CodeAttributeDeclaration / CodeAttributeDeclarationCollection | Test*Decorators |
| CodeAttributeArgument / CodeAttributeArgumentCollection | Indirectly |
| CodeBaseReferenceExpression | TestCodeBaseReferenceExpression |
| CodeBinaryOperatorExpression | TestCodeIterationStatement |
| CodeBinaryOperatorType | TestCodeIterationStatement |
| CodeCastExpression | TestCodeCastExpression |
| CodeCatchClause / CodeCatchClauseCollection | TestCodeTryCatchFinallyStatement, TestCodeTryCatchFinallyStatement |
| CodeCommentStatement / CodeCommentStatementCollection | TestCodeCommentStatement* |
| CodeCompileUnit | Indirectly |
| CodeConditionStatement | TestCodeConditionStatement* |
| CodeConstructor | Indirectly |
| CodeDirective / CodeDirectiveCollection | Indirectly with CodeRegionDirective |
| CodeTypeDelegate | TestCodeTypeDelegate |
| CodeExpressionStatement | TestCodeIterationStatement |
| CodeExpression | TestCodeExpression |
| CodeExpressionCollection | Indirectly |
| CodeFieldReferenceExpression | TestCodeFieldReferenceExpression |
| CodeIndexerExpression | TestCodeIterationStatement |
| CodeIterationStatement | TestCodeIterationStatement |
| CodeMemberField | TestCodeTypeDeclarationWithMembers |
| CodeMemberMethod | TestCodeTypeDeclarationWithMethodAndParameterDecorators |
| CodeMemberProperty | TestCodeTypeDeclarationWithPropertyMembers |
| CodeMethodInvokeExpression | TestCodeIterationStatement, TestCodeTryCatchFinallyStatement, TestCodeTryCatchStatement |
| CodeMethodReferenceExpression | TestCodeMethodReferenceExpression, TestCodeMethodReferenceExpressionGeneric, TestCodeIterationStatement |
| CodeMethodReturnStatement | TestCodeMethodReturnStatement |
| CodeNamespace / CodeNamespaceCollection | Indirectly |
| CodeObject | Indirectly in many derived classes |
| CodeObjectCreateExpression | TestCodeObjectCreateExpression* |
| CodeParameterDeclarationExpression / CodeParameterDeclarationExpressionCollection | TestTuple4Callback, TestTupleCallbackSnipet, TestTupleCallbackSnipet, TestCodeParameterDeclarationExpression |
| CodePrimitiveExpression | TestCodeArrayCreateExpressionWithInit, and many |
| CodePropertyReferenceExpression | TestCodePropertyReferenceExpression |
| CodeRegionDirective | TestPersonWithRegions, Test2TypesWithRegions |
| CodeSnippetExpression | TestCodeArrayIndexerExpression, and many |
| CodeSnippetStatement | TestCodeConditionStatement, and many |
| CodeSnippetTypeMember | Indirectly |
| CodeStatement / CodeStatementCollection | TestCodeConditionStatementElse, and many |
| CodeThisReferenceExpression | TestCodePropertyReferenceExpression, and many |
| CodeThrowExceptionStatement | TestCodeThrowExceptionStatement |
| CodeTryCatchFinallyStatement | TestCodeTryCatchFinallyStatement, TestCodeTryFinallyStatement, TestCodeTryCatchStatement |
| CodeTypeDeclaration | TestCodeTypeDeclaration* |
| CodeTypeDeclarationCollection | Indirectly with namespace.Types |
| CodeTypeMember / CodeTypeMemberCollection | Indirectly |
| CodeTypeOfExpression | TestCodeTypeOfExpression |
| CodeTypeParameter / CodeTypeParameterCollection | Indirectly |
| CodeTypeReference / CodeTypeReferenceCollection | TestCodeArrayCreateExpressionWithoutInit, and many |
| CodeTypeReferenceExpression | TestCodeTypeReferenceExpression, TestCodeIterationStatement |
| CodeVariableDeclarationStatement | TestCodeVariableDeclarationStatement* |
| CodeVariableReferenceExpression | TestCodeVariableReferenceExpression, and many |
Hints:
TypeScript CodeDOM had been a by-product of Strongly Typed Web API Client Generators since October 2015 until February 2024, as a foundation library of TypeScript code generators of WebApiClientGen and then OpenApiClientGen, as well as internal code generators in some companies in which the development teams have chosen the CodeDOM approach over templates.
Legacy repositories: