From bf039c79e4cf07927d8f097f35be4f0c13f032fb Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 16 Sep 2024 10:14:50 -0700 Subject: [PATCH] fix(zod): generated schemas fail to compile when a delegate discriminator field has default value Fixes #1693 --- packages/schema/src/plugins/zod/generator.ts | 10 ++++++---- tests/regression/tests/issue-1693.test.ts | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 tests/regression/tests/issue-1693.test.ts diff --git a/packages/schema/src/plugins/zod/generator.ts b/packages/schema/src/plugins/zod/generator.ts index fecf69ced..d1e6ad297 100644 --- a/packages/schema/src/plugins/zod/generator.ts +++ b/packages/schema/src/plugins/zod/generator.ts @@ -370,10 +370,10 @@ export function ${refineFuncName}(schema: z.ZodType isDiscriminatorField(field)); + const delegateDiscriminatorFields = model.fields.filter((field) => isDiscriminatorField(field)); const omitDiscriminators = - delegateFields.length > 0 - ? `.omit({ ${delegateFields.map((f) => `${f.name}: true`).join(', ')} })` + delegateDiscriminatorFields.length > 0 + ? `.omit({ ${delegateDiscriminatorFields.map((f) => `${f.name}: true`).join(', ')} })` : ''; //////////////////////////////////////////////// @@ -485,9 +485,11 @@ export const ${upperCaseFirst(model.name)}PrismaUpdateSchema = ${prismaUpdateSch // mark fields with default as optional if (fieldsWithDefault.length > 0) { + // delegate discriminator fields are omitted from the base schema, so we need + // to take care not to make them partial otherwise the schema won't compile createSchema = this.makePartial( createSchema, - fieldsWithDefault.map((f) => f.name) + fieldsWithDefault.filter((f) => !delegateDiscriminatorFields.includes(f)).map((f) => f.name) ); } diff --git a/tests/regression/tests/issue-1693.test.ts b/tests/regression/tests/issue-1693.test.ts new file mode 100644 index 000000000..cf61b286c --- /dev/null +++ b/tests/regression/tests/issue-1693.test.ts @@ -0,0 +1,20 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('issue 1693', () => { + it('regression', async () => { + await loadSchema( + ` + model Animal { + id String @id @default(uuid()) + animalType String @default("") + @@delegate(animalType) + } + + model Dog extends Animal { + name String + } + `, + { fullZod: true } + ); + }); +});