@@ -11,7 +11,12 @@ import {
1111} from "openapi3-ts/oas30" ;
1212import { singular } from "pluralize" ;
1313import { isValidIdentifier } from "tsutils" ;
14- import ts , { factory as f } from "typescript" ;
14+ import ts , {
15+ factory as f ,
16+ isIdentifierPart ,
17+ isIdentifierStart ,
18+ } from "typescript" ;
19+ import { convertNumberToWord } from "../utils/getEnumProperties" ;
1520import { getReferenceSchema } from "./getReference" ;
1621
1722type RemoveIndex < T > = {
@@ -56,11 +61,37 @@ export const schemaToTypeAliasDeclaration = (
5661 const jsDocNode = isSchemaObject ( schema )
5762 ? getJSDocComment ( schema , context )
5863 : undefined ;
64+
65+ let identifier = pascal ( name ) ;
66+
67+ if ( identifier . length > 0 && ! isNaN ( Number ( identifier ) ) ) {
68+ // If the identifier can be cast to a number, convert it to a word.
69+ identifier = pascal ( convertNumberToWord ( Number ( identifier ) ) ) ;
70+ } else {
71+ // If the identifier does not start with a valid character but valid identifier part, prefix it with an underscore.
72+ if (
73+ ! isIdentifierStart ( identifier . charCodeAt ( 0 ) , ts . ScriptTarget . Latest ) &&
74+ isIdentifierPart ( identifier . charCodeAt ( 0 ) , ts . ScriptTarget . Latest )
75+ ) {
76+ identifier = `_${ identifier } ` ;
77+ }
78+
79+ // If the identifier is still not valid, remove invalid characters.
80+ if ( ! isValidIdentifier ( identifier ) ) {
81+ identifier = identifier . replace ( / [ ^ a - z A - Z 0 - 9 _ ] / g, "" ) ;
82+ }
83+
84+ // If the identifier is now empty, set it to "_".
85+ if ( identifier . length === 0 ) {
86+ identifier = "_" ;
87+ }
88+ }
89+
5990 const declarationNode = f . createTypeAliasDeclaration (
6091 [ f . createModifier ( ts . SyntaxKind . ExportKeyword ) ] ,
61- pascal ( name ) ,
92+ identifier ,
6293 undefined ,
63- getType ( schema , context , name )
94+ getType ( schema , context , identifier )
6495 ) ;
6596
6697 return jsDocNode ? [ jsDocNode , declarationNode ] : [ declarationNode ] ;
@@ -89,10 +120,10 @@ export const getType = (
89120
90121 let refNode : ts . TypeNode = f . createTypeReferenceNode (
91122 namespace === context . currentComponent
92- ? f . createIdentifier ( pascal ( name ) )
123+ ? f . createIdentifier ( name )
93124 : f . createQualifiedName (
94125 f . createIdentifier ( pascal ( namespace ) ) ,
95- f . createIdentifier ( pascal ( name ) )
126+ f . createIdentifier ( name )
96127 )
97128 ) ;
98129
@@ -174,7 +205,7 @@ export const getType = (
174205 if ( schema . enum ) {
175206 if ( isNodeEnum ) {
176207 return f . createUnionTypeNode ( [
177- f . createTypeReferenceNode ( f . createIdentifier ( pascal ( name || "" ) ) ) ,
208+ f . createTypeReferenceNode ( f . createIdentifier ( name || "" ) ) ,
178209 ...( schema . nullable ? [ f . createLiteralTypeNode ( f . createNull ( ) ) ] : [ ] ) ,
179210 ] ) ;
180211 }
0 commit comments