@@ -66,25 +66,34 @@ type EatWhitespace<Input extends string> = string extends Input
66
66
? EatWhitespace < Remainder >
67
67
: Input
68
68
69
- type HasFKey < FKeyName , Relationships > = Relationships extends [ infer R ]
70
- ? R extends { foreignKeyName : FKeyName }
69
+ type InArray < Item , Array > = Array extends [ infer I ]
70
+ ? I extends Item
71
71
? true
72
72
: false
73
- : Relationships extends [ infer R , ...infer Rest ]
74
- ? HasFKey < FKeyName , [ R ] > extends true
73
+ : Array extends [ infer I , ...infer Rest ]
74
+ ? InArray < Item , [ I ] > extends true
75
75
? true
76
- : HasFKey < FKeyName , Rest >
76
+ : InArray < Item , Rest >
77
77
: false
78
78
79
- type HasFKeyToFRel < FRelName , Relationships > = Relationships extends [ infer R ]
80
- ? R extends { referencedRelation : FRelName }
81
- ? true
82
- : false
79
+ type HasFKey < FKeyName , Relationships > = InArray < { foreignKeyName : FKeyName } , Relationships >
80
+
81
+ type HasFKeyToFRel < FRelName , Relationships > = InArray <
82
+ { referencedRelation : FRelName } ,
83
+ Relationships
84
+ >
85
+
86
+ type ColumnForeignRelation < ColName , Relationships > = Relationships extends [ infer R ]
87
+ ? R extends { columns : string [ ] ; referencedRelation : string }
88
+ ? InArray < ColName , R [ 'columns' ] > extends true
89
+ ? [ R [ 'referencedRelation' ] ]
90
+ : null
91
+ : null
83
92
: Relationships extends [ infer R , ...infer Rest ]
84
- ? HasFKeyToFRel < FRelName , [ R ] > extends true
85
- ? true
86
- : HasFKeyToFRel < FRelName , Rest >
87
- : false
93
+ ? ColumnForeignRelation < ColName , [ R ] > extends [ infer Rel ]
94
+ ? [ Rel ]
95
+ : ColumnForeignRelation < ColName , Rest >
96
+ : null
88
97
89
98
/**
90
99
* Constructs a type definition for a single field of an object.
@@ -119,23 +128,39 @@ type ConstructFieldDefinition<
119
128
: never
120
129
}
121
130
: Field extends { name : string ; original : string ; children : unknown [ ] }
122
- ? {
123
- [ _ in Field [ 'name' ] ] : GetResultHelper <
124
- Schema ,
125
- ( Schema [ 'Tables' ] & Schema [ 'Views' ] ) [ Field [ 'original' ] ] [ 'Row' ] ,
126
- ( Schema [ 'Tables' ] & Schema [ 'Views' ] ) [ Field [ 'original' ] ] extends { Relationships : infer R }
127
- ? R
128
- : unknown ,
129
- Field [ 'children' ] ,
130
- unknown
131
- > extends infer Child
132
- ? Relationships extends unknown [ ]
133
- ? HasFKeyToFRel < Field [ 'original' ] , Relationships > extends true
134
- ? Child | null
131
+ ? ColumnForeignRelation < Field [ 'original' ] , Relationships > extends [ infer ForeignRel ]
132
+ ? // handle `col:foreign_key_column`
133
+ ForeignRel extends keyof ( Schema [ 'Tables' ] & Schema [ 'Views' ] )
134
+ ? {
135
+ [ _ in Field [ 'name' ] ] : GetResultHelper <
136
+ Schema ,
137
+ ( Schema [ 'Tables' ] & Schema [ 'Views' ] ) [ ForeignRel ] [ 'Row' ] ,
138
+ ( Schema [ 'Tables' ] & Schema [ 'Views' ] ) [ ForeignRel ] extends { Relationships : infer R }
139
+ ? R
140
+ : unknown ,
141
+ Field [ 'children' ] ,
142
+ unknown
143
+ > | null
144
+ }
145
+ : { poop : ForeignRel ; fuck : Field [ 'original' ] ; ass : Relationships }
146
+ : // handle `col:relation`
147
+ {
148
+ [ _ in Field [ 'name' ] ] : GetResultHelper <
149
+ Schema ,
150
+ ( Schema [ 'Tables' ] & Schema [ 'Views' ] ) [ Field [ 'original' ] ] [ 'Row' ] ,
151
+ ( Schema [ 'Tables' ] & Schema [ 'Views' ] ) [ Field [ 'original' ] ] extends { Relationships : infer R }
152
+ ? R
153
+ : unknown ,
154
+ Field [ 'children' ] ,
155
+ unknown
156
+ > extends infer Child
157
+ ? Relationships extends unknown [ ]
158
+ ? HasFKeyToFRel < Field [ 'original' ] , Relationships > extends true
159
+ ? Child | null
160
+ : Child [ ]
135
161
: Child [ ]
136
- : Child [ ]
137
- : never
138
- }
162
+ : never
163
+ }
139
164
: Field extends { name : string ; original : string }
140
165
? Field [ 'original' ] extends keyof Row
141
166
? { [ K in Field [ 'name' ] ] : Row [ Field [ 'original' ] ] }
0 commit comments