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}<T, D extends z.ZodTypeDef>(schema: z.ZodType<T } // delegate discriminator fields are to be excluded from mutation schemas - const delegateFields = model.fields.filter((field) => 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 } + ); + }); +});