@@ -37,6 +37,22 @@ type FilterRelationNodes<Nodes extends Node[]> = UnionToArray<
37
37
} [ number ]
38
38
>
39
39
40
+ /*
41
+ ** Because of pg-meta types generation there is some cases where a same relationship can be duplicated
42
+ ** if the relation is across schemas and views this ensure that we dedup those relations and treat them
43
+ ** as postgrest would.
44
+ ** TODO: This is necessary to allow the check for required desambiguation but shouldn't if the
45
+ ** generated relationships were correct pointing out that each realation is actually toward a different schema
46
+ */
47
+ export type DeduplicateRelationships < T extends readonly unknown [ ] > = T extends readonly [
48
+ infer First ,
49
+ ...infer Rest
50
+ ]
51
+ ? First extends Rest [ number ]
52
+ ? DeduplicateRelationships < Rest extends readonly unknown [ ] ? Rest : [ ] >
53
+ : [ First , ...DeduplicateRelationships < Rest extends readonly unknown [ ] ? Rest : [ ] > ]
54
+ : T
55
+
40
56
export type ResolveRelationships <
41
57
Schema extends GenericSchema ,
42
58
RelationName extends string ,
@@ -110,7 +126,7 @@ export type CheckDuplicateEmbededReference<
110
126
RelationsNodes
111
127
> extends infer ResolvedRels
112
128
? ResolvedRels extends unknown [ ]
113
- ? FindDuplicates < ResolvedRels > extends infer Duplicates
129
+ ? FindDuplicates < DeduplicateRelationships < ResolvedRels > > extends infer Duplicates
114
130
? Duplicates extends never
115
131
? false
116
132
: Duplicates extends { fieldName : infer FieldName extends string }
@@ -127,7 +143,7 @@ export type CheckDuplicateEmbededReference<
127
143
* Returns a boolean representing whether there is a foreign key referencing
128
144
* a given relation.
129
145
*/
130
- type HasFKeyToFRel < FRelName , Relationships > = Relationships extends [ infer R ]
146
+ export type HasFKeyToFRel < FRelName , Relationships > = Relationships extends [ infer R ]
131
147
? R extends { referencedRelation : FRelName }
132
148
? true
133
149
: false
@@ -139,7 +155,7 @@ type HasFKeyToFRel<FRelName, Relationships> = Relationships extends [infer R]
139
155
/**
140
156
* Checks if there is more than one relation to a given foreign relation name in the Relationships.
141
157
*/
142
- type HasMultipleFKeysToFRel < FRelName , Relationships > = Relationships extends [
158
+ export type HasMultipleFKeysToFRel < FRelName , Relationships > = Relationships extends [
143
159
infer R ,
144
160
...infer Rest
145
161
]
@@ -166,7 +182,10 @@ type CheckRelationshipError<
166
182
direction : 'reverse'
167
183
}
168
184
? // We check if there is possible confusion with other relations with this table
169
- HasMultipleFKeysToFRel < RelatedRelationName , Relationships > extends true
185
+ HasMultipleFKeysToFRel <
186
+ RelatedRelationName ,
187
+ DeduplicateRelationships < Relationships >
188
+ > extends true
170
189
? // If there is, postgrest will fail at runtime, and require desambiguation via hinting
171
190
RequireHintingSelectQueryError <
172
191
RelatedRelationName ,
@@ -184,7 +203,7 @@ type CheckRelationshipError<
184
203
}
185
204
? HasMultipleFKeysToFRel <
186
205
RelatedRelationName ,
187
- TablesAndViews < Schema > [ From ] [ 'Relationships' ]
206
+ DeduplicateRelationships < TablesAndViews < Schema > [ From ] [ 'Relationships' ] >
188
207
> extends true
189
208
? RequireHintingSelectQueryError < From extends string ? From : 'unknown' , RelatedRelationName >
190
209
: FoundRelation
@@ -236,7 +255,10 @@ type ResolveReverseRelationship<
236
255
from : CurrentTableOrView
237
256
}
238
257
: // If the relation was found via implicit relation naming, we must ensure there is no conflicting matches
239
- HasMultipleFKeysToFRel < RelatedRelationName , Relationships > extends true
258
+ HasMultipleFKeysToFRel <
259
+ RelatedRelationName ,
260
+ DeduplicateRelationships < Relationships >
261
+ > extends true
240
262
? RequireHintingSelectQueryError <
241
263
RelatedRelationName ,
242
264
CurrentTableOrView extends string ? CurrentTableOrView : 'unknown'
0 commit comments