@@ -116,13 +116,13 @@ export function addJSDocComment(schemaObject: AnnotatedSchemaObject, node: ts.Pr
116116}
117117
118118/** Convert OpenAPI ref into TS indexed access node (ex: `components["schemas"]["Foo"]`) */
119- export function oapiRef ( path : string ) : ts . TypeNode {
119+ export function oapiRef ( path : string , deepRequired = false ) : ts . TypeNode {
120120 const { pointer } = parseRef ( path ) ;
121121 if ( pointer . length === 0 ) {
122122 throw new Error ( `Error parsing $ref: ${ path } . Is this a valid $ref?` ) ;
123123 }
124124 let t : ts . TypeReferenceNode | ts . IndexedAccessTypeNode = ts . factory . createTypeReferenceNode (
125- ts . factory . createIdentifier ( String ( pointer [ 0 ] ) ) ,
125+ ts . factory . createIdentifier ( deepRequired ? `DeepRequired< ${ String ( pointer [ 0 ] ) } >` : String ( pointer [ 0 ] ) ) ,
126126 ) ;
127127 if ( pointer . length > 1 ) {
128128 for ( let i = 1 ; i < pointer . length ; i ++ ) {
@@ -251,6 +251,16 @@ export function tsArrayLiteralExpression(
251251 let variableName = sanitizeMemberName ( name ) ;
252252 variableName = `${ variableName [ 0 ] . toLowerCase ( ) } ${ variableName . substring ( 1 ) } ` ;
253253
254+ if (
255+ options ?. injectFooter &&
256+ ! options . injectFooter . some ( ( node ) => ts . isTypeAliasDeclaration ( node ) && node ?. name ?. escapedText === "DeepRequired" )
257+ ) {
258+ const helper = stringToAST (
259+ "type DeepRequired<T> = { [K in keyof T]: Required<DeepRequired<T[K]>> };" ,
260+ ) [ 0 ] as any ;
261+ options . injectFooter . push ( helper ) ;
262+ }
263+
254264 const arrayType = options ?. readonly
255265 ? tsReadonlyArray ( elementType , options . injectFooter )
256266 : ts . factory . createArrayTypeNode ( elementType ) ;
0 commit comments