@@ -57,7 +57,8 @@ export type EdgeDBSchemaTypes<Types extends SchemaTypes> =
57
57
export interface EdgeDBModelTypes {
58
58
Name : string ;
59
59
Shape : { } ;
60
- MultiLinks : string ;
60
+ ReturnShape : { } ;
61
+ MultiLink : string ;
61
62
LinkName : string ;
62
63
Links : Record <
63
64
string ,
@@ -71,29 +72,57 @@ export interface EdgeDBModelTypes {
71
72
export type EdgeDBModelShape <
72
73
Types extends SchemaTypes ,
73
74
Name extends EdgeDBSchemaTypeKeys < Types > ,
74
- > = EdgeDBSchemaTypes < Types > [ Name ] extends infer Property
75
- ? Property extends BaseObject
75
+ > = EdgeDBSchemaTypes < Types > [ Name ] extends infer ModelProperties
76
+ ? ModelProperties extends BaseObject
76
77
? {
77
78
Name : Name ;
78
- Shape : Property ;
79
- MultiLinks : '' ;
80
- LinkName : extractLinks < Property > extends infer Link
79
+ Shape : ModelProperties ;
80
+ ReturnShape : {
81
+ [ K in keyof ModelProperties ] ?: ModelProperties [ K ] extends ObjectType
82
+ ? ModelProperties [ K ] extends infer Link
83
+ ? { [ K in keyof Link ] ?: Link [ K ] }
84
+ : ModelProperties [ K ]
85
+ : ModelProperties [ K ] ;
86
+ } ;
87
+ MultiLink : extractMultiLinks < ModelProperties > extends infer Link
88
+ ? Link extends string
89
+ ? SplitLT < Link >
90
+ : never
91
+ : never ;
92
+ LinkName : extractLinks < ModelProperties > extends infer Link
81
93
? Link extends string
82
94
? SplitLT < Link >
83
95
: never
84
96
: never ;
85
97
} extends infer ModelTypesWithoutLinks
86
- ? ModelTypesWithoutLinks extends { LinkName : string ; Shape : Record < string , unknown > }
98
+ ? ModelTypesWithoutLinks extends {
99
+ LinkName : string ;
100
+ Shape : Record < string , unknown > ;
101
+ }
87
102
? ModelTypesWithoutLinks & {
88
103
Links : {
89
104
[ Key in ModelTypesWithoutLinks [ 'LinkName' ] ] : {
90
105
Shape : ModelTypesWithoutLinks [ 'Shape' ] [ Key ] extends infer Shape
91
106
? Shape extends BaseObject
92
- ? Shape
107
+ ? { [ K in keyof Shape ] ?: Shape [ K ] }
93
108
: Shape extends Array < BaseObject >
94
- ? Shape [ 0 ]
109
+ ? { [ K in keyof Shape [ 0 ] ] ?: Shape [ 0 ] [ K ] }
95
110
: never
96
111
: never ;
112
+ Types : EdgeDBModelShape <
113
+ Types ,
114
+ ModelTypesWithoutLinks [ 'Shape' ] [ Key ] extends infer Base
115
+ ? Base extends TypeSet < ObjectType >
116
+ ? Base [ '__element__' ] [ '__name__' ] extends infer ModelName
117
+ ? ModelName extends string
118
+ ? SplitDefault < ModelName > extends EdgeDBSchemaTypeKeys < Types >
119
+ ? SplitDefault < ModelName >
120
+ : never
121
+ : never
122
+ : never
123
+ : never
124
+ : never
125
+ > ;
97
126
} ;
98
127
} ;
99
128
}
@@ -275,16 +304,17 @@ type extractLinksToPartial<Shape extends { [key: string]: any }> = Shape extends
275
304
: never
276
305
: never ;
277
306
278
- // Extract links from queryBuilder object, not from type
279
- // Shape extends infer T
280
- // ? T extends TypeSet<ObjectType>
281
- // ? {
282
- // [K in keyof T['__element__']['__pointers__']]: T['__element__']['__pointers__'][K] extends LinkDesc
283
- // ? boolean
284
- // : never;
285
- // }
286
- // : never
287
- // : never;
307
+ type extractMultiLinksToPartial < Shape extends { [ key : string ] : any } > = Shape extends infer T
308
+ ? T extends object
309
+ ? {
310
+ [ Key in keyof Shape ] : Shape [ Key ] extends infer Link
311
+ ? Link extends Array < BaseObject >
312
+ ? boolean
313
+ : never
314
+ : never ;
315
+ }
316
+ : never
317
+ : never ;
288
318
289
319
// Filter out links from model type
290
320
export type extractLinks <
@@ -295,14 +325,25 @@ export type extractLinks<
295
325
[ K in keyof Links ] : [ boolean ] extends [ Links [ K ] ] ? K : never ;
296
326
} [ keyof Links ]
297
327
: null ;
328
+ export type extractMultiLinks <
329
+ Model extends object ,
330
+ PartialLinks extends extractMultiLinksToPartial < Model > = extractMultiLinksToPartial < Model > ,
331
+ > = PartialLinks extends infer Links
332
+ ? {
333
+ [ K in keyof Links ] : [ boolean ] extends [ Links [ K ] ] ? K : never ;
334
+ } [ keyof Links ]
335
+ : null ;
298
336
299
337
type Split < S extends string , D extends string > = S extends `${infer T } ${D } ${infer U } `
300
338
? never
301
339
: [ S ] [ 0 ] ;
302
340
303
341
// For removing backlinks from `link` fields
304
- // eg. fields: "posts" | "comments" | "<author" -> fields: "posts" | "comments"
342
+ // eg. SplitLT< "posts" | "comments" | "<author"> -> "posts" | "comments"
305
343
export type SplitLT < LinkOptions extends string > = Split < LinkOptions , '<' > ;
344
+ // Only way to get models name is to split it on its BaseObject __name__
345
+ // eg. SplitDefault<"default::Post"> -> "Post"
346
+ export type SplitDefault < LinkOptions extends string > = Split < LinkOptions , 'default::' > ;
306
347
307
348
export type EdgeDBObjectFieldOptions <
308
349
Types extends SchemaTypes ,
@@ -394,8 +435,8 @@ export type EdgeDBFieldResolver<
394
435
info : GraphQLResolveInfo ,
395
436
) => ShapeFromTypeParam < Types , Param , Nullable > extends infer Shape
396
437
? [ Shape ] extends [ [ readonly ( infer Item ) [ ] | null | undefined ] ]
397
- ? ListResolveValue < Partial < Shape > , Item , ResolveReturnShape >
398
- : MaybePromise < Partial < Shape > >
438
+ ? ListResolveValue < Shape , Item , ResolveReturnShape >
439
+ : MaybePromise < Shape >
399
440
: never ;
400
441
401
442
export type EdgeDBFieldOptions <
0 commit comments