Skip to content

Commit 1ea8e55

Browse files
authored
fix(zod): generated schemas fail to compile when a delegate discrimin ator field has default value (#1705)
1 parent 1395892 commit 1ea8e55

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

packages/schema/src/plugins/zod/generator.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -370,10 +370,10 @@ export function ${refineFuncName}<T, D extends z.ZodTypeDef>(schema: z.ZodType<T
370370
}
371371

372372
// delegate discriminator fields are to be excluded from mutation schemas
373-
const delegateFields = model.fields.filter((field) => isDiscriminatorField(field));
373+
const delegateDiscriminatorFields = model.fields.filter((field) => isDiscriminatorField(field));
374374
const omitDiscriminators =
375-
delegateFields.length > 0
376-
? `.omit({ ${delegateFields.map((f) => `${f.name}: true`).join(', ')} })`
375+
delegateDiscriminatorFields.length > 0
376+
? `.omit({ ${delegateDiscriminatorFields.map((f) => `${f.name}: true`).join(', ')} })`
377377
: '';
378378

379379
////////////////////////////////////////////////
@@ -485,9 +485,11 @@ export const ${upperCaseFirst(model.name)}PrismaUpdateSchema = ${prismaUpdateSch
485485

486486
// mark fields with default as optional
487487
if (fieldsWithDefault.length > 0) {
488+
// delegate discriminator fields are omitted from the base schema, so we need
489+
// to take care not to make them partial otherwise the schema won't compile
488490
createSchema = this.makePartial(
489491
createSchema,
490-
fieldsWithDefault.map((f) => f.name)
492+
fieldsWithDefault.filter((f) => !delegateDiscriminatorFields.includes(f)).map((f) => f.name)
491493
);
492494
}
493495

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { loadSchema } from '@zenstackhq/testtools';
2+
3+
describe('issue 1693', () => {
4+
it('regression', async () => {
5+
await loadSchema(
6+
`
7+
model Animal {
8+
id String @id @default(uuid())
9+
animalType String @default("")
10+
@@delegate(animalType)
11+
}
12+
13+
model Dog extends Animal {
14+
name String
15+
}
16+
`,
17+
{ fullZod: true }
18+
);
19+
});
20+
});

0 commit comments

Comments
 (0)