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,34 @@ type FilterOperator =
25
25
| 'phfts'
26
26
| 'wfts'
27
27
28
+ // Match relationshop filters with `table.column` syntax and resolve underlying column value.
29
+ // If not matched, fallback to generic type.
30
+ type ResolveFilterValue <
31
+ Tables extends Record < string , GenericTable > ,
32
+ Row extends Record < string , unknown > ,
33
+ ColumnName extends string ,
34
+ Wrapper ,
35
+ Fallback
36
+ > = ColumnName extends `${infer RelationshipTable } .${infer RelationshipColumn } `
37
+ ? ResolveFilterRelationshipValue < Tables , RelationshipTable , RelationshipColumn >
38
+ : ColumnName extends keyof Row
39
+ ? Wrapper extends Something
40
+ ? Wrapper < Row [ ColumnName ] >
41
+ : Row [ ColumnName ]
42
+ : Fallback
43
+
44
+ type ResolveFilterRelationshipValue <
45
+ Tables extends Record < string , GenericTable > ,
46
+ RelationshipTable extends string ,
47
+ RelationshipColumn extends string
48
+ > = RelationshipTable extends keyof Tables
49
+ ? 'Row' extends keyof Tables [ RelationshipTable ]
50
+ ? RelationshipColumn extends keyof Tables [ RelationshipTable ] [ 'Row' ]
51
+ ? Tables [ RelationshipTable ] [ 'Row' ] [ RelationshipColumn ]
52
+ : unknown
53
+ : unknown
54
+ : unknown
55
+
28
56
export default class PostgrestFilterBuilder <
29
57
Schema extends GenericSchema ,
30
58
Row extends Record < string , unknown > ,
@@ -42,7 +70,9 @@ export default class PostgrestFilterBuilder<
42
70
*/
43
71
eq < ColumnName extends string > (
44
72
column : ColumnName ,
45
- value : ColumnName extends keyof Row ? NonNullable < Row [ ColumnName ] > : NonNullable < unknown >
73
+ value : ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > extends never
74
+ ? NonNullable < unknown >
75
+ : NonNullable < ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > >
46
76
) : this {
47
77
this . url . searchParams . append ( column , `eq.${ value } ` )
48
78
return this
@@ -56,7 +86,9 @@ export default class PostgrestFilterBuilder<
56
86
*/
57
87
neq < ColumnName extends string > (
58
88
column : ColumnName ,
59
- value : ColumnName extends keyof Row ? Row [ ColumnName ] : unknown
89
+ value : ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > extends never
90
+ ? unknown
91
+ : ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName >
60
92
) : this {
61
93
this . url . searchParams . append ( column , `neq.${ value } ` )
62
94
return this
@@ -234,7 +266,9 @@ export default class PostgrestFilterBuilder<
234
266
*/
235
267
in < ColumnName extends string > (
236
268
column : ColumnName ,
237
- values : ColumnName extends keyof Row ? ReadonlyArray < Row [ ColumnName ] > : unknown [ ]
269
+ values : ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > extends never
270
+ ? unknown [ ]
271
+ : ReadonlyArray < ResolveFilterValue < Schema [ 'Tables' ] , Row , ColumnName > >
238
272
) : this {
239
273
const cleanedValues = Array . from ( new Set ( values ) )
240
274
. map ( ( s ) => {
0 commit comments