1- import { getIdFields , isAuthInvocation , isDataModelFieldReference } from '@zenstackhq/sdk' ;
1+ import { getIdFields , getPrismaClientGenerator , isAuthInvocation , isDataModelFieldReference } from '@zenstackhq/sdk' ;
22import {
33 DataModel ,
44 DataModelField ,
55 Expression ,
66 isDataModel ,
77 isMemberAccessExpr ,
8+ isTypeDef ,
89 TypeDef ,
910 type Model ,
1011} from '@zenstackhq/sdk/ast' ;
@@ -19,27 +20,39 @@ export function generateAuthType(model: Model, authDecl: DataModel | TypeDef) {
1920 const types = new Map <
2021 string ,
2122 {
23+ isTypeDef : boolean ;
2224 // relation fields to require
2325 requiredRelations : { name : string ; type : string } [ ] ;
2426 }
2527 > ( ) ;
2628
27- types . set ( authDecl . name , { requiredRelations : [ ] } ) ;
29+ types . set ( authDecl . name , { isTypeDef : isTypeDef ( authDecl ) , requiredRelations : [ ] } ) ;
2830
29- const ensureType = ( model : string ) => {
30- if ( ! types . has ( model ) ) {
31- types . set ( model , { requiredRelations : [ ] } ) ;
31+ const findType = ( name : string ) =>
32+ model . declarations . find ( ( d ) => ( isDataModel ( d ) || isTypeDef ( d ) ) && d . name === name ) ;
33+
34+ const ensureType = ( name : string ) => {
35+ if ( ! types . has ( name ) ) {
36+ const decl = findType ( name ) ;
37+ if ( ! decl ) {
38+ return ;
39+ }
40+ types . set ( name , { isTypeDef : isTypeDef ( decl ) , requiredRelations : [ ] } ) ;
3241 }
3342 } ;
3443
35- const addAddField = ( model : string , name : string , type : string , array : boolean ) => {
36- let fields = types . get ( model ) ;
37- if ( ! fields ) {
38- fields = { requiredRelations : [ ] } ;
39- types . set ( model , fields ) ;
44+ const addTypeField = ( typeName : string , fieldName : string , fieldType : string , array : boolean ) => {
45+ let typeInfo = types . get ( typeName ) ;
46+ if ( ! typeInfo ) {
47+ const decl = findType ( typeName ) ;
48+ if ( ! decl ) {
49+ return ;
50+ }
51+ typeInfo = { isTypeDef : isTypeDef ( decl ) , requiredRelations : [ ] } ;
52+ types . set ( typeName , typeInfo ) ;
4053 }
41- if ( ! fields . requiredRelations . find ( ( f ) => f . name === name ) ) {
42- fields . requiredRelations . push ( { name, type : array ? `${ type } []` : type } ) ;
54+ if ( ! typeInfo . requiredRelations . find ( ( f ) => f . name === fieldName ) ) {
55+ typeInfo . requiredRelations . push ( { name : fieldName , type : array ? `${ fieldType } []` : fieldType } ) ;
4356 }
4457 } ;
4558
@@ -57,7 +70,7 @@ export function generateAuthType(model: Model, authDecl: DataModel | TypeDef) {
5770 // member is a relation
5871 const fieldType = memberDecl . type . reference . ref . name ;
5972 ensureType ( fieldType ) ;
60- addAddField ( exprType . name , memberDecl . name , fieldType , memberDecl . type . array ) ;
73+ addTypeField ( exprType . name , memberDecl . name , fieldType , memberDecl . type . array ) ;
6174 }
6275 }
6376 }
@@ -69,12 +82,15 @@ export function generateAuthType(model: Model, authDecl: DataModel | TypeDef) {
6982 if ( isDataModel ( fieldType ) ) {
7083 // field is a relation
7184 ensureType ( fieldType . name ) ;
72- addAddField ( fieldDecl . $container . name , node . target . $refText , fieldType . name , fieldDecl . type . array ) ;
85+ addTypeField ( fieldDecl . $container . name , node . target . $refText , fieldType . name , fieldDecl . type . array ) ;
7386 }
7487 }
7588 } ) ;
7689 } ) ;
7790
91+ const prismaGenerator = getPrismaClientGenerator ( model ) ;
92+ const isNewGenerator = ! ! prismaGenerator ?. isNewGenerator ;
93+
7894 // generate:
7995 // `
8096 // namespace auth {
@@ -86,25 +102,27 @@ export function generateAuthType(model: Model, authDecl: DataModel | TypeDef) {
86102 return `export namespace auth {
87103 type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };
88104${ Array . from ( types . entries ( ) )
89- . map ( ( [ model , fields ] ) => {
90- let result = `Partial<_P.${ model } >` ;
105+ . map ( ( [ type , typeInfo ] ) => {
106+ // TypeDef types are generated in "json-types.ts" for the new "prisma-client" generator
107+ const typeRef = isNewGenerator && typeInfo . isTypeDef ? `$TypeDefs.${ type } ` : `_P.${ type } ` ;
108+ let result = `Partial<${ typeRef } >` ;
91109
92- if ( model === authDecl . name ) {
110+ if ( type === authDecl . name ) {
93111 // auth model's id fields are always required
94112 const idFields = getIdFields ( authDecl ) . map ( ( f ) => f . name ) ;
95113 if ( idFields . length > 0 ) {
96114 result = `WithRequired<${ result } , ${ idFields . map ( ( f ) => `'${ f } '` ) . join ( '|' ) } >` ;
97115 }
98116 }
99117
100- if ( fields . requiredRelations . length > 0 ) {
118+ if ( typeInfo . requiredRelations . length > 0 ) {
101119 // merge required relation fields
102- result = `${ result } & { ${ fields . requiredRelations . map ( ( f ) => `${ f . name } : ${ f . type } ` ) . join ( '; ' ) } }` ;
120+ result = `${ result } & { ${ typeInfo . requiredRelations . map ( ( f ) => `${ f . name } : ${ f . type } ` ) . join ( '; ' ) } }` ;
103121 }
104122
105123 result = `${ result } & Record<string, unknown>` ;
106124
107- return ` export type ${ model } = ${ result } ;` ;
125+ return ` export type ${ type } = ${ result } ;` ;
108126 } )
109127 . join ( '\n' ) }
110128}` ;
0 commit comments