@@ -1021,20 +1021,49 @@ export class TsSchemaGenerator {
10211021 // generate enums
10221022 const enums = model . declarations . filter ( isEnum ) ;
10231023 for ( const e of enums ) {
1024- // generate:
1025- // export const enum Enum = {
1026- // value1 = 'value1',
1027- // value2 = 'value2',
1028- // }
1029- let enumDecl = ts . factory . createEnumDeclaration (
1024+ // generate: export const Enum = schema.enums.Enum;
1025+ let enumDecl = ts . factory . createVariableStatement (
10301026 [ ts . factory . createModifier ( ts . SyntaxKind . ExportKeyword ) ] ,
1031- e . name ,
1032- e . fields . map ( ( f ) => ts . factory . createEnumMember ( f . name , ts . factory . createStringLiteral ( f . name ) ) ) ,
1027+ ts . factory . createVariableDeclarationList (
1028+ [
1029+ ts . factory . createVariableDeclaration (
1030+ e . name ,
1031+ undefined ,
1032+ undefined ,
1033+ ts . factory . createPropertyAccessExpression (
1034+ ts . factory . createPropertyAccessExpression (
1035+ ts . factory . createIdentifier ( 'schema' ) ,
1036+ ts . factory . createIdentifier ( 'enums' ) ,
1037+ ) ,
1038+ ts . factory . createIdentifier ( e . name ) ,
1039+ ) ,
1040+ ) ,
1041+ ] ,
1042+ ts . NodeFlags . Const ,
1043+ ) ,
10331044 ) ;
10341045 if ( e . comments . length > 0 ) {
10351046 enumDecl = this . generateDocs ( enumDecl , e ) ;
10361047 }
10371048 statements . push ( enumDecl ) ;
1049+
1050+ // generate: export type Enum = (typeof Enum)[keyof typeof Enum];
1051+ let typeAlias = ts . factory . createTypeAliasDeclaration (
1052+ [ ts . factory . createModifier ( ts . SyntaxKind . ExportKeyword ) ] ,
1053+ e . name ,
1054+ undefined ,
1055+ ts . factory . createIndexedAccessTypeNode (
1056+ ts . factory . createTypeQueryNode ( ts . factory . createIdentifier ( e . name ) ) ,
1057+ ts . factory . createTypeOperatorNode (
1058+ ts . SyntaxKind . KeyOfKeyword ,
1059+ ts . factory . createTypeQueryNode ( ts . factory . createIdentifier ( e . name ) ) ,
1060+ ) ,
1061+ ) ,
1062+ ) ;
1063+ if ( e . comments . length > 0 ) {
1064+ typeAlias = this . generateDocs ( typeAlias , e ) ;
1065+ }
1066+ statements . push ( typeAlias ) ;
10381067 }
10391068
10401069 this . generateBannerComments ( statements ) ;
@@ -1047,7 +1076,10 @@ export class TsSchemaGenerator {
10471076 fs . writeFileSync ( outputFile , result ) ;
10481077 }
10491078
1050- private generateDocs < T extends ts . TypeAliasDeclaration | ts . EnumDeclaration > ( tsDecl : T , decl : DataModel | Enum ) : T {
1079+ private generateDocs < T extends ts . TypeAliasDeclaration | ts . VariableStatement > (
1080+ tsDecl : T ,
1081+ decl : DataModel | Enum ,
1082+ ) : T {
10511083 return ts . addSyntheticLeadingComment (
10521084 tsDecl ,
10531085 ts . SyntaxKind . MultiLineCommentTrivia ,
0 commit comments