77 getDataModelAndTypeDefs ,
88 getDataModels ,
99 getForeignKeyFields ,
10- getLiteral ,
10+ getPrismaClientGenerator ,
1111 getRelationField ,
1212 hasAttribute ,
1313 isDelegateModel ,
@@ -22,7 +22,6 @@ import {
2222 ReferenceExpr ,
2323 isArrayExpr ,
2424 isDataModel ,
25- isGeneratorDecl ,
2625 isTypeDef ,
2726 type Model ,
2827} from '@zenstackhq/sdk/ast' ;
@@ -56,7 +55,7 @@ import { generateTypeDefType } from './model-typedef-generator';
5655// information of delegate models and their sub models
5756type DelegateInfo = [ DataModel , DataModel [ ] ] [ ] ;
5857
59- const LOGICAL_CLIENT_GENERATION_PATH = './. logical-prisma-client' ;
58+ const LOGICAL_CLIENT_GENERATION_PATH = './logical-prisma-client' ;
6059
6160export class EnhancerGenerator {
6261 // regex for matching "ModelCreateXXXInput" and "ModelUncheckedCreateXXXInput" type
@@ -114,6 +113,9 @@ export class EnhancerGenerator {
114113 if ( this . needsLogicalClient ) {
115114 prismaTypesFixed = true ;
116115 resultPrismaTypeImport = LOGICAL_CLIENT_GENERATION_PATH ;
116+ if ( this . isNewPrismaClientGenerator ) {
117+ resultPrismaTypeImport += '/client' ;
118+ }
117119 const result = await this . generateLogicalPrisma ( ) ;
118120 dmmf = result . dmmf ;
119121 }
@@ -440,23 +442,14 @@ export type Enhanced<Client> =
440442 }
441443
442444 private getPrismaClientGeneratorName ( model : Model ) {
443- for ( const generator of model . declarations . filter ( isGeneratorDecl ) ) {
444- if (
445- generator . fields . some (
446- ( f ) => f . name === 'provider' && getLiteral < string > ( f . value ) === 'prisma-client-js'
447- )
448- ) {
449- return generator . name ;
450- }
445+ const gen = getPrismaClientGenerator ( model ) ;
446+ if ( ! gen ) {
447+ throw new PluginError ( name , `Cannot find "prisma-client-js" or "prisma-client" generator in the schema` ) ;
451448 }
452- throw new PluginError ( name , `Cannot find prisma-client-js generator in the schema` ) ;
449+ return gen . name ;
453450 }
454451
455452 private async processClientTypes ( prismaClientDir : string ) {
456- // make necessary updates to the generated `index.d.ts` file and overwrite it
457- const project = new Project ( ) ;
458- const sf = project . addSourceFileAtPath ( path . join ( prismaClientDir , 'index.d.ts' ) ) ;
459-
460453 // build a map of delegate models and their sub models
461454 const delegateInfo : DelegateInfo = [ ] ;
462455 this . model . declarations
@@ -468,6 +461,16 @@ export type Enhanced<Client> =
468461 }
469462 } ) ;
470463
464+ if ( this . isNewPrismaClientGenerator ) {
465+ await this . processClientTypesNewPrismaGenerator ( prismaClientDir , delegateInfo ) ;
466+ } else {
467+ await this . processClientTypesLegacyPrismaGenerator ( prismaClientDir , delegateInfo ) ;
468+ }
469+ }
470+ private async processClientTypesLegacyPrismaGenerator ( prismaClientDir : string , delegateInfo : DelegateInfo ) {
471+ const project = new Project ( ) ;
472+ const sf = project . addSourceFileAtPath ( path . join ( prismaClientDir , 'index.d.ts' ) ) ;
473+
471474 // transform index.d.ts and write it into a new file (better perf than in-line editing)
472475 const sfNew = project . createSourceFile ( path . join ( prismaClientDir , 'index-fixed.d.ts' ) , undefined , {
473476 overwrite : true ,
@@ -484,6 +487,36 @@ export type Enhanced<Client> =
484487 await sfNew . save ( ) ;
485488 }
486489
490+ private async processClientTypesNewPrismaGenerator ( prismaClientDir : string , delegateInfo : DelegateInfo ) {
491+ const project = new Project ( ) ;
492+
493+ for ( const d of this . model . declarations . filter ( isDataModel ) ) {
494+ const fileName = `${ prismaClientDir } /models/${ d . name } .ts` ;
495+ const sf = project . addSourceFileAtPath ( fileName ) ;
496+ const sfNew = project . createSourceFile ( `${ prismaClientDir } /models/${ d . name } -fixed.ts` , undefined , {
497+ overwrite : true ,
498+ } ) ;
499+
500+ const syntaxList = sf . getChildren ( ) [ 0 ] ;
501+ if ( ! Node . isSyntaxList ( syntaxList ) ) {
502+ throw new PluginError ( name , `Unexpected syntax list structure in ${ fileName } ` ) ;
503+ }
504+
505+ syntaxList . getChildren ( ) . forEach ( ( node ) => {
506+ if ( Node . isInterfaceDeclaration ( node ) ) {
507+ sfNew . addInterface ( this . transformInterface ( node , delegateInfo ) ) ;
508+ } else if ( Node . isTypeAliasDeclaration ( node ) ) {
509+ sfNew . addTypeAlias ( this . transformTypeAlias ( node , delegateInfo ) ) ;
510+ } else {
511+ sfNew . addStatements ( node . getText ( ) ) ;
512+ }
513+ } ) ;
514+
515+ await sfNew . move ( sf . getFilePath ( ) , { overwrite : true } ) ;
516+ await sfNew . save ( ) ;
517+ }
518+ }
519+
487520 private transformPrismaTypes ( sf : SourceFile , sfNew : SourceFile , delegateInfo : DelegateInfo ) {
488521 // copy toplevel imports
489522 sfNew . addImportDeclarations ( sf . getImportDeclarations ( ) . map ( ( n ) => n . getStructure ( ) ) ) ;
@@ -639,7 +672,7 @@ export type Enhanced<Client> =
639672 source = `${ payloadRecord [ 1 ]
640673 . map (
641674 ( concrete ) =>
642- `($${ concrete . name } Payload<ExtArgs> & { scalars: { ${ discriminatorDecl . name } : '${ concrete . name } ' } })`
675+ `(Prisma. $${ concrete . name } Payload<ExtArgs> & { scalars: { ${ discriminatorDecl . name } : '${ concrete . name } ' } })`
643676 )
644677 . join ( ' | ' ) } `;
645678 }
@@ -916,4 +949,9 @@ export type Enhanced<Client> =
916949 private trimEmptyLines ( source : string ) : string {
917950 return source . replace ( / ^ \s * [ \r \n ] / gm, '' ) ;
918951 }
952+
953+ private get isNewPrismaClientGenerator ( ) {
954+ const gen = getPrismaClientGenerator ( this . model ) ;
955+ return ! ! gen ?. isNewGenerator ;
956+ }
919957}
0 commit comments