@@ -20,6 +20,7 @@ import {
2020import z from 'zod/v4' ;
2121import { createZodDto } from '../dto' ;
2222import { SwaggerModule } from '@nestjs/swagger' ;
23+ import { SwaggerModule as SwaggerModuleV7 } from '@nestjs/swagger-v7' ;
2324import { cleanupOpenApiDoc } from '../cleanupOpenApiDoc' ;
2425import get from 'lodash/get' ;
2526import { PREFIX } from '../const' ;
@@ -3122,6 +3123,44 @@ describe('issue#368', () => {
31223123 } ) ;
31233124} ) ;
31243125
3126+ describe ( 'issue#371 - optional object properties in @nestjs/swagger version 7' , ( ) => {
3127+ test ( 'does not include optional object as a required field' , async ( ) => {
3128+ class BodyDto extends createZodDto (
3129+ z . object ( {
3130+ name : z . string ( ) ,
3131+ filter : z
3132+ . object ( {
3133+ age : z . number ( ) ,
3134+ } )
3135+ . optional ( ) ,
3136+ } ) ,
3137+ ) { }
3138+
3139+ @Controller ( )
3140+ class TestController {
3141+ constructor ( ) { }
3142+
3143+ @Post ( )
3144+ create ( @Body ( ) _body : BodyDto ) {
3145+ return { } ;
3146+ }
3147+ }
3148+
3149+ const doc = await getSwaggerDoc ( TestController , {
3150+ swaggerVersion : '7' ,
3151+ } ) ;
3152+
3153+ expect ( get ( doc , 'components.schemas.BodyDto.required' ) ) . toEqual ( [ 'name' ] ) ;
3154+ expect (
3155+ get ( doc , 'components.schemas.BodyDto.properties.filter' ) ,
3156+ ) . not . toHaveProperty ( 'selfRequired' ) ;
3157+ expect ( JSON . stringify ( doc ) ) . not . toContain ( PREFIX ) ;
3158+
3159+ expect ( await getOpenApiErrors ( doc , '3.0' ) ) . toHaveLength ( 0 ) ;
3160+ expect ( await getOpenApiErrors ( doc , '3.1' ) ) . toHaveLength ( 0 ) ;
3161+ } ) ;
3162+ } ) ;
3163+
31253164async function createApp ( controllerClass : Type < unknown > ) {
31263165 @Module ( {
31273166 imports : [ ] ,
@@ -3142,15 +3181,20 @@ async function getSwaggerDoc(
31423181 {
31433182 cleanUp = true ,
31443183 version,
3184+ swaggerVersion,
31453185 } : {
31463186 cleanUp ?: boolean ;
31473187 version ?: '3.1' | '3.0' | 'auto' ;
3188+ swaggerVersion ?: '7' | 'default' ;
31483189 } = { } ,
31493190) {
31503191 const app = await createApp ( controllerClass ) ;
31513192
3152- const doc = SwaggerModule . createDocument ( app , new DocumentBuilder ( ) . build ( ) ) ;
3193+ const doc = (
3194+ swaggerVersion === '7' ? SwaggerModuleV7 : SwaggerModule
3195+ ) . createDocument ( app , new DocumentBuilder ( ) . build ( ) ) ;
31533196 if ( cleanUp ) {
3197+ // @ts -expect-error - FIXME
31543198 return cleanupOpenApiDoc ( doc , { version } ) ;
31553199 } else {
31563200 return doc ;
0 commit comments