@@ -164,7 +164,7 @@ function addIndexedAccess(node: ts.TypeReferenceNode | ts.IndexedAccessTypeNode,
164164 * must check the parameter definition to determine the how to index into
165165 * the openapi-typescript type.
166166 **/
167- export function oapiRef ( path : string , resolved ?: OapiRefResolved ) : ts . TypeNode {
167+ export function oapiRef ( path : string , resolved ?: OapiRefResolved , deep = false ) : ts . TypeNode {
168168 const { pointer } = parseRef ( path ) ;
169169 if ( pointer . length === 0 ) {
170170 throw new Error ( `Error parsing $ref: ${ path } . Is this a valid $ref?` ) ;
@@ -179,7 +179,9 @@ export function oapiRef(path: string, resolved?: OapiRefResolved): ts.TypeNode {
179179 const restSegments = pointer . slice ( 3 ) ;
180180
181181 const leadingType = addIndexedAccess (
182- ts . factory . createTypeReferenceNode ( ts . factory . createIdentifier ( String ( initialSegment ) ) ) ,
182+ ts . factory . createTypeReferenceNode (
183+ ts . factory . createIdentifier ( deep ? `DeepRequired<${ String ( initialSegment ) } >` : String ( initialSegment ) ) ,
184+ ) ,
183185 ...leadingSegments ,
184186 ) ;
185187
@@ -305,6 +307,16 @@ export function tsArrayLiteralExpression(
305307 let variableName = sanitizeMemberName ( name ) ;
306308 variableName = `${ variableName [ 0 ] . toLowerCase ( ) } ${ variableName . substring ( 1 ) } ` ;
307309
310+ if (
311+ options ?. injectFooter &&
312+ ! options . injectFooter . some ( ( node ) => ts . isTypeAliasDeclaration ( node ) && node ?. name ?. escapedText === "DeepRequired" )
313+ ) {
314+ const helper = stringToAST (
315+ "type DeepRequired<T> = { [K in keyof T]: Required<DeepRequired<T[K]>> };" ,
316+ ) [ 0 ] as any ;
317+ options . injectFooter . push ( helper ) ;
318+ }
319+
308320 const arrayType = options ?. readonly
309321 ? tsReadonlyArray ( elementType , options . injectFooter )
310322 : ts . factory . createArrayTypeNode ( elementType ) ;
0 commit comments