11import PostgrestTransformBuilder from './PostgrestTransformBuilder'
2- import { GenericSchema } from './types'
2+ import { GenericSchema , GenericTable } from './types'
33
44type FilterOperator =
55 | 'eq'
@@ -25,6 +25,35 @@ type FilterOperator =
2525 | 'phfts'
2626 | 'wfts'
2727
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+
2857export default class PostgrestFilterBuilder <
2958 Schema extends GenericSchema ,
3059 Row extends Record < string , unknown > ,
@@ -42,7 +71,9 @@ export default class PostgrestFilterBuilder<
4271 */
4372 eq < ColumnName extends string > (
4473 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 > >
4677 ) : this {
4778 this . url . searchParams . append ( column , `eq.${ value } ` )
4879 return this
@@ -56,7 +87,9 @@ export default class PostgrestFilterBuilder<
5687 */
5788 neq < ColumnName extends string > (
5889 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 >
6093 ) : this {
6194 this . url . searchParams . append ( column , `neq.${ value } ` )
6295 return this
@@ -234,7 +267,9 @@ export default class PostgrestFilterBuilder<
234267 */
235268 in < ColumnName extends string > (
236269 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 > >
238273 ) : this {
239274 const cleanedValues = Array . from ( new Set ( values ) )
240275 . map ( ( s ) => {
0 commit comments