From ab4c5c64d7081ebe98fd0f3bdfad1e3053725f5d Mon Sep 17 00:00:00 2001 From: bearlogin Date: Mon, 25 Mar 2024 14:18:38 +0300 Subject: [PATCH] make required field false if undefined --- .../zod-nestjs/src/lib/create-zod-dto.spec.ts | 65 +++++++++++++++++-- packages/zod-nestjs/src/lib/create-zod-dto.ts | 8 +-- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/packages/zod-nestjs/src/lib/create-zod-dto.spec.ts b/packages/zod-nestjs/src/lib/create-zod-dto.spec.ts index d6a15b2..91347a9 100644 --- a/packages/zod-nestjs/src/lib/create-zod-dto.spec.ts +++ b/packages/zod-nestjs/src/lib/create-zod-dto.spec.ts @@ -126,10 +126,11 @@ describe('zod-nesjs create-zod-dto', () => { const metadataFactory = getMetadataFactory(schema); const generatedSchema = metadataFactory(); - const personName = generatedSchema?.person.properties?.name as SchemaObject30 - const tags = generatedSchema?.person.properties?.tags as SchemaObject30 - const tagsItems = tags.items as SchemaObject30 - const tagName = tagsItems.properties?.name as SchemaObject30 + const personName = generatedSchema?.person.properties + ?.name as SchemaObject30; + const tags = generatedSchema?.person.properties?.tags as SchemaObject30; + const tagsItems = tags.items as SchemaObject30; + const tagName = tagsItems.properties?.name as SchemaObject30; expect(generatedSchema).toBeDefined(); expect(personName.type).toEqual('string'); @@ -150,6 +151,62 @@ describe('zod-nesjs create-zod-dto', () => { expect(generatedSchema?.name.type).toEqual('string'); expect(generatedSchema?.name.nullable).toBe(true); }); + + it('should correct work with optional fields and make required fields false', () => { + const schema = z.object({ + pagination: z + .object({ + limit: z.number(), + offset: z.number(), + }) + .optional(), + filter: z + .object({ + category: z.string().uuid(), + userId: z.string().uuid(), + }) + .optional(), + sort: z + .object({ + field: z.string(), + order: z.string(), + }) + .optional(), + }); + const metadataFactory = getMetadataFactory(schema); + + const generatedSchema = metadataFactory(); + expect(generatedSchema?.pagination.required).toEqual(false); + expect(generatedSchema?.sort.required).toEqual(false); + expect(generatedSchema?.filter.required).toEqual(false); + }); + + it('should correct work with optional fields and make required field true and optional field false', () => { + const schema = z.object({ + pagination: z + .object({ + limit: z.number(), + offset: z.number(), + }) + .optional(), + filter: z + .object({ + category: z.string().uuid(), + userId: z.string().uuid(), + }) + .optional(), + sort: z.object({ + field: z.string(), + order: z.string(), + }), + }); + const metadataFactory = getMetadataFactory(schema); + + const generatedSchema = metadataFactory(); + expect(generatedSchema?.pagination.required).toEqual(false); + expect(generatedSchema?.sort.required).toEqual(true); + expect(generatedSchema?.filter.required).toEqual(false); + }); }); function getMetadataFactory(zodRef: OpenApiZodAny) { diff --git a/packages/zod-nestjs/src/lib/create-zod-dto.ts b/packages/zod-nestjs/src/lib/create-zod-dto.ts index c7988e8..3b87630 100644 --- a/packages/zod-nestjs/src/lib/create-zod-dto.ts +++ b/packages/zod-nestjs/src/lib/create-zod-dto.ts @@ -117,7 +117,7 @@ export const createZodDto = ( )) { SchemaHolderClass.convertSchemaObject( subSchemaObject, - schemaObject.required?.includes(key) + schemaObject.required?.includes(key) ?? false ); } @@ -141,9 +141,9 @@ export const createZodDto = ( if (Array.isArray(convertedSchemaObject.type)) { convertedSchemaObject.nullable = convertedSchemaObject.type.includes('null') || undefined; - convertedSchemaObject.type = convertedSchemaObject.type.find( - (item) => item !== 'null' - ) || 'string'; + convertedSchemaObject.type = + convertedSchemaObject.type.find((item) => item !== 'null') || + 'string'; } else if (convertedSchemaObject.type === 'null') { convertedSchemaObject.type = 'string'; // There ist no explicit null value in OpenAPI 3.0 convertedSchemaObject.nullable = true;