1
1
import PostgrestTransformBuilder from './PostgrestTransformBuilder'
2
- import { GenericSchema } from './types'
2
+ import { GenericSchema , GenericTable } from './types'
3
3
4
4
type FilterOperator =
5
5
| 'eq'
@@ -25,6 +25,35 @@ type FilterOperator =
25
25
| 'phfts'
26
26
| 'wfts'
27
27
28
+ // Match relationship filters with `table.column` syntax and resolve underlying
29
+ // column value. If not matched, fallback to generic type.
30
+ // TODO: Validate the relationship itself ala select-query-parser. Currently we
31
+ // assume that all tables have valid relationships to each other, despite
32
+ // nonexistent foreign keys.
33
+ type ResolveFilterValue <
34
+ Tables extends Record < string , GenericTable > ,
35
+ Row extends Record < string , unknown > ,
36
+ ColumnName extends string
37
+ > = ColumnName extends `${infer RelationshipTable } .${infer Remainder } `
38
+ ? Remainder extends `${infer _ } .${infer _ } `
39
+ ? ResolveFilterValue < Tables , Row , Remainder >
40
+ : ResolveFilterRelationshipValue < Tables , RelationshipTable , Remainder >
41
+ : ColumnName extends keyof Row
42
+ ? Row [ ColumnName ]
43
+ : never
44
+
45
+ type ResolveFilterRelationshipValue <
46
+ Tables extends Record < string , GenericTable > ,
47
+ RelationshipTable extends string ,
48
+ RelationshipColumn extends string
49
+ > = RelationshipTable extends keyof Tables
50
+ ? 'Row' extends keyof Tables [ RelationshipTable ]
51
+ ? RelationshipColumn extends keyof Tables [ RelationshipTable ] [ 'Row' ]
52
+ ? Tables [ RelationshipTable ] [ 'Row' ] [ RelationshipColumn ]
53
+ : unknown
54
+ : unknown
55
+ : unknown
56
+
28
57
export default class PostgrestFilterBuilder <
29
58
Schema extends GenericSchema ,
30
59
Row extends Record < string , unknown > ,
@@ -42,7 +71,9 @@ export default class PostgrestFilterBuilder<
42
71
*/
43
72
eq < ColumnName extends string > (
44
73
column : ColumnName ,
45
- value : ColumnName extends keyof Row ? NonNullable < Row [ ColumnName ] > : NonNullable < unknown >
74
+ value : ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > extends never
75
+ ? NonNullable < unknown >
76
+ : NonNullable < ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > >
46
77
) : this {
47
78
this . url . searchParams . append ( column , `eq.${ value } ` )
48
79
return this
@@ -56,7 +87,9 @@ export default class PostgrestFilterBuilder<
56
87
*/
57
88
neq < ColumnName extends string > (
58
89
column : ColumnName ,
59
- value : ColumnName extends keyof Row ? Row [ ColumnName ] : unknown
90
+ value : ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > extends never
91
+ ? unknown
92
+ : ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName >
60
93
) : this {
61
94
this . url . searchParams . append ( column , `neq.${ value } ` )
62
95
return this
@@ -234,7 +267,9 @@ export default class PostgrestFilterBuilder<
234
267
*/
235
268
in < ColumnName extends string > (
236
269
column : ColumnName ,
237
- values : ColumnName extends keyof Row ? ReadonlyArray < Row [ ColumnName ] > : unknown [ ]
270
+ values : ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > extends never
271
+ ? unknown [ ]
272
+ : ReadonlyArray < ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > >
238
273
) : this {
239
274
const cleanedValues = Array . from ( new Set ( values ) )
240
275
. map ( ( s ) => {
0 commit comments