1
- import { getIdFields , hasAttribute , isAuthInvocation , isDataModelFieldReference } from '@zenstackhq/sdk' ;
1
+ import { getIdFields , isAuthInvocation , isDataModelFieldReference } from '@zenstackhq/sdk' ;
2
2
import {
3
3
DataModel ,
4
4
DataModelField ,
@@ -18,41 +18,27 @@ export function generateAuthType(model: Model, authModel: DataModel) {
18
18
const types = new Map <
19
19
string ,
20
20
{
21
- // scalar fields to directly pick from Prisma-generated type
22
- pickFields : string [ ] ;
23
-
24
- // relation fields to include
25
- addFields : { name : string ; type : string } [ ] ;
21
+ // relation fields to require
22
+ requiredRelations : { name : string ; type : string } [ ] ;
26
23
}
27
24
> ( ) ;
28
25
29
- types . set ( authModel . name , { pickFields : getIdFields ( authModel ) . map ( ( f ) => f . name ) , addFields : [ ] } ) ;
26
+ types . set ( authModel . name , { requiredRelations : [ ] } ) ;
30
27
31
28
const ensureType = ( model : string ) => {
32
29
if ( ! types . has ( model ) ) {
33
- types . set ( model , { pickFields : [ ] , addFields : [ ] } ) ;
34
- }
35
- } ;
36
-
37
- const addPickField = ( model : string , field : string ) => {
38
- let fields = types . get ( model ) ;
39
- if ( ! fields ) {
40
- fields = { pickFields : [ ] , addFields : [ ] } ;
41
- types . set ( model , fields ) ;
42
- }
43
- if ( ! fields . pickFields . includes ( field ) ) {
44
- fields . pickFields . push ( field ) ;
30
+ types . set ( model , { requiredRelations : [ ] } ) ;
45
31
}
46
32
} ;
47
33
48
34
const addAddField = ( model : string , name : string , type : string , array : boolean ) => {
49
35
let fields = types . get ( model ) ;
50
36
if ( ! fields ) {
51
- fields = { pickFields : [ ] , addFields : [ ] } ;
37
+ fields = { requiredRelations : [ ] } ;
52
38
types . set ( model , fields ) ;
53
39
}
54
- if ( ! fields . addFields . find ( ( f ) => f . name === name ) ) {
55
- fields . addFields . push ( { name, type : array ? `${ type } []` : type } ) ;
40
+ if ( ! fields . requiredRelations . find ( ( f ) => f . name === name ) ) {
41
+ fields . requiredRelations . push ( { name, type : array ? `${ type } []` : type } ) ;
56
42
}
57
43
} ;
58
44
@@ -71,11 +57,6 @@ export function generateAuthType(model: Model, authModel: DataModel) {
71
57
const fieldType = memberDecl . type . reference . ref . name ;
72
58
ensureType ( fieldType ) ;
73
59
addAddField ( exprType . name , memberDecl . name , fieldType , memberDecl . type . array ) ;
74
- } else {
75
- // member is a scalar
76
- if ( ! isIgnoredField ( node . member . ref ) ) {
77
- addPickField ( exprType . name , node . member . $refText ) ;
78
- }
79
60
}
80
61
}
81
62
}
@@ -88,11 +69,6 @@ export function generateAuthType(model: Model, authModel: DataModel) {
88
69
// field is a relation
89
70
ensureType ( fieldType . name ) ;
90
71
addAddField ( fieldDecl . $container . name , node . target . $refText , fieldType . name , fieldDecl . type . array ) ;
91
- } else {
92
- if ( ! isIgnoredField ( fieldDecl ) ) {
93
- // field is a scalar
94
- addPickField ( fieldDecl . $container . name , node . target . $refText ) ;
95
- }
96
72
}
97
73
}
98
74
} ) ;
@@ -112,16 +88,21 @@ ${Array.from(types.entries())
112
88
. map ( ( [ model , fields ] ) => {
113
89
let result = `Partial<_P.${ model } >` ;
114
90
115
- if ( fields . pickFields . length > 0 ) {
116
- result = `WithRequired<${ result } , ${ fields . pickFields
117
- . map ( ( f ) => `'${ f } '` )
118
- . join ( '|' ) } > & Record<string, unknown>`;
91
+ if ( model === authModel . name ) {
92
+ // auth model's id fields are always required
93
+ const idFields = getIdFields ( authModel ) . map ( ( f ) => f . name ) ;
94
+ if ( idFields . length > 0 ) {
95
+ result = `WithRequired<${ result } , ${ idFields . map ( ( f ) => `'${ f } '` ) . join ( '|' ) } >` ;
96
+ }
119
97
}
120
98
121
- if ( fields . addFields . length > 0 ) {
122
- result = `${ result } & { ${ fields . addFields . map ( ( { name, type } ) => `${ name } : ${ type } ` ) . join ( '; ' ) } }` ;
99
+ if ( fields . requiredRelations . length > 0 ) {
100
+ // merge required relation fields
101
+ result = `${ result } & { ${ fields . requiredRelations . map ( ( f ) => `${ f . name } : ${ f . type } ` ) . join ( '; ' ) } }` ;
123
102
}
124
103
104
+ result = `${ result } & Record<string, unknown>` ;
105
+
125
106
return ` export type ${ model } = ${ result } ;` ;
126
107
} )
127
108
. join ( '\n' ) }
@@ -145,7 +126,3 @@ function isAuthAccess(node: AstNode): node is Expression {
145
126
146
127
return false ;
147
128
}
148
-
149
- function isIgnoredField ( field : DataModelField | undefined ) {
150
- return ! ! ( field && hasAttribute ( field , '@ignore' ) ) ;
151
- }
0 commit comments