11import { DELEGATE_AUX_RELATION_PREFIX } from '@zenstackhq/runtime' ;
2+ import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers' ;
23import {
34 ExpressionContext ,
45 PluginError ,
@@ -23,10 +24,19 @@ import {
2324 resolvePath ,
2425 saveSourceFile ,
2526} from '@zenstackhq/sdk' ;
26- import { DataModel , EnumField , Model , TypeDef , isArrayExpr , isDataModel , isEnum , isTypeDef } from '@zenstackhq/sdk/ast' ;
27+ import {
28+ DataModel ,
29+ DataModelField ,
30+ EnumField ,
31+ Model ,
32+ TypeDef ,
33+ isArrayExpr ,
34+ isDataModel ,
35+ isEnum ,
36+ isTypeDef ,
37+ } from '@zenstackhq/sdk/ast' ;
2738import { addMissingInputObjectTypes , resolveAggregateOperationSupport } from '@zenstackhq/sdk/dmmf-helpers' ;
2839import { getPrismaClientImportSpec , supportCreateMany , type DMMF } from '@zenstackhq/sdk/prisma' ;
29- import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers' ;
3040import { streamAllContents } from 'langium' ;
3141import path from 'path' ;
3242import type { CodeBlockWriter , SourceFile } from 'ts-morph' ;
@@ -418,25 +428,10 @@ export const ${typeDef.name}Schema = ${refineFuncName}(${noRefineSchema});
418428 this . addPreludeAndImports ( model , writer , output ) ;
419429
420430 // base schema - including all scalar fields, with optionality following the schema
421- writer . write ( `const baseSchema = z.object(` ) ;
422- writer . inlineBlock ( ( ) => {
423- scalarFields . forEach ( ( field ) => {
424- writer . writeLine ( `${ field . name } : ${ makeFieldSchema ( field ) } ,` ) ;
425- } ) ;
426- } ) ;
431+ this . createModelBaseSchema ( 'baseSchema' , writer , scalarFields , true ) ;
427432
428- switch ( this . options . mode ) {
429- case 'strip' :
430- // zod strips by default
431- writer . writeLine ( ')' ) ;
432- break ;
433- case 'passthrough' :
434- writer . writeLine ( ').passthrough();' ) ;
435- break ;
436- default :
437- writer . writeLine ( ').strict();' ) ;
438- break ;
439- }
433+ // base schema without field defaults
434+ this . createModelBaseSchema ( 'baseSchemaWithoutDefaults' , writer , scalarFields , false ) ;
440435
441436 // relation fields
442437
@@ -536,7 +531,9 @@ export const ${upperCaseFirst(model.name)}Schema = ${modelSchema};
536531 ////////////////////////////////////////////////
537532
538533 // schema for validating prisma create input (all fields optional)
539- let prismaCreateSchema = this . makePassthrough ( this . makePartial ( `baseSchema${ omitDiscriminators } ` ) ) ;
534+ let prismaCreateSchema = this . makePassthrough (
535+ this . makePartial ( `baseSchemaWithoutDefaults${ omitDiscriminators } ` )
536+ ) ;
540537 if ( refineFuncName ) {
541538 prismaCreateSchema = `${ refineFuncName } (${ prismaCreateSchema } )` ;
542539 }
@@ -554,7 +551,7 @@ export const ${upperCaseFirst(model.name)}PrismaCreateSchema = ${prismaCreateSch
554551 ${ scalarFields
555552 . filter ( ( f ) => ! isDiscriminatorField ( f ) )
556553 . map ( ( field ) => {
557- let fieldSchema = makeFieldSchema ( field ) ;
554+ let fieldSchema = makeFieldSchema ( field , false ) ;
558555 if ( field . type . type === 'Int' || field . type . type === 'Float' ) {
559556 fieldSchema = `z.union([${ fieldSchema } , z.record(z.unknown())])` ;
560557 }
@@ -577,7 +574,7 @@ export const ${upperCaseFirst(model.name)}PrismaUpdateSchema = ${prismaUpdateSch
577574 // 3. Create schema
578575 ////////////////////////////////////////////////
579576
580- let createSchema = `baseSchema ${ omitDiscriminators } ` ;
577+ let createSchema = `baseSchemaWithoutDefaults ${ omitDiscriminators } ` ;
581578 const fieldsWithDefault = scalarFields . filter (
582579 ( field ) => hasAttribute ( field , '@default' ) || hasAttribute ( field , '@updatedAt' ) || field . type . array
583580 ) ;
@@ -631,7 +628,7 @@ export const ${upperCaseFirst(model.name)}CreateSchema = ${createSchema};
631628 ////////////////////////////////////////////////
632629
633630 // for update all fields are optional
634- let updateSchema = this . makePartial ( `baseSchema ${ omitDiscriminators } ` ) ;
631+ let updateSchema = this . makePartial ( `baseSchemaWithoutDefaults ${ omitDiscriminators } ` ) ;
635632
636633 // export schema with only scalar fields: `[Model]UpdateScalarSchema`
637634 const updateScalarSchema = `${ upperCaseFirst ( model . name ) } UpdateScalarSchema` ;
@@ -673,6 +670,33 @@ export const ${upperCaseFirst(model.name)}UpdateSchema = ${updateSchema};
673670 return schemaName ;
674671 }
675672
673+ private createModelBaseSchema (
674+ name : string ,
675+ writer : CodeBlockWriter ,
676+ scalarFields : DataModelField [ ] ,
677+ addDefaults : boolean
678+ ) {
679+ writer . write ( `const ${ name } = z.object(` ) ;
680+ writer . inlineBlock ( ( ) => {
681+ scalarFields . forEach ( ( field ) => {
682+ writer . writeLine ( `${ field . name } : ${ makeFieldSchema ( field , addDefaults ) } ,` ) ;
683+ } ) ;
684+ } ) ;
685+
686+ switch ( this . options . mode ) {
687+ case 'strip' :
688+ // zod strips by default
689+ writer . writeLine ( ')' ) ;
690+ break ;
691+ case 'passthrough' :
692+ writer . writeLine ( ').passthrough();' ) ;
693+ break ;
694+ default :
695+ writer . writeLine ( ').strict();' ) ;
696+ break ;
697+ }
698+ }
699+
676700 private createRefineFunction ( decl : DataModel | TypeDef , writer : CodeBlockWriter ) {
677701 const refinements = this . makeValidationRefinements ( decl ) ;
678702 let refineFuncName : string | undefined ;
0 commit comments