1
1
import PostgrestTransformBuilder from './PostgrestTransformBuilder'
2
+ import { JsonPathToAccessor , JsonPathToType } from './select-query-parser/utils'
2
3
import { GenericSchema } from './types'
3
4
4
5
type FilterOperator =
@@ -25,6 +26,10 @@ type FilterOperator =
25
26
| 'phfts'
26
27
| 'wfts'
27
28
29
+ export type IsStringOperator < Path extends string > = Path extends `${string } ->>${string } `
30
+ ? true
31
+ : false
32
+
28
33
// Match relationship filters with `table.column` syntax and resolve underlying
29
34
// column value. If not matched, fallback to generic type.
30
35
// TODO: Validate the relationship itself ala select-query-parser. Currently we
@@ -40,6 +45,14 @@ type ResolveFilterValue<
40
45
: ResolveFilterRelationshipValue < Schema , RelationshipTable , Remainder >
41
46
: ColumnName extends keyof Row
42
47
? Row [ ColumnName ]
48
+ : // If the column selection is a jsonpath like `data->value` or `data->>value` we attempt to match
49
+ // the expected type with the parsed custom json type
50
+ IsStringOperator < ColumnName > extends true
51
+ ? string
52
+ : JsonPathToType < Row , JsonPathToAccessor < ColumnName > > extends infer JsonPathValue
53
+ ? JsonPathValue extends never
54
+ ? never
55
+ : JsonPathValue
43
56
: never
44
57
45
58
type ResolveFilterRelationshipValue <
@@ -75,7 +88,12 @@ export default class PostgrestFilterBuilder<
75
88
column : ColumnName ,
76
89
value : ResolveFilterValue < Schema , Row , ColumnName > extends never
77
90
? NonNullable < unknown >
78
- : NonNullable < ResolveFilterValue < Schema , Row , ColumnName > >
91
+ : // We want to infer the type before wrapping it into a `NonNullable` to avoid too deep
92
+ // type resolution error
93
+ ResolveFilterValue < Schema , Row , ColumnName > extends infer ResolvedFilterValue
94
+ ? NonNullable < ResolvedFilterValue >
95
+ : // We should never enter this case as all the branches are covered above
96
+ never
79
97
) : this {
80
98
this . url . searchParams . append ( column , `eq.${ value } ` )
81
99
return this
@@ -91,7 +109,9 @@ export default class PostgrestFilterBuilder<
91
109
column : ColumnName ,
92
110
value : ResolveFilterValue < Schema , Row , ColumnName > extends never
93
111
? unknown
94
- : ResolveFilterValue < Schema , Row , ColumnName >
112
+ : ResolveFilterValue < Schema , Row , ColumnName > extends infer ResolvedFilterValue
113
+ ? ResolvedFilterValue
114
+ : never
95
115
) : this {
96
116
this . url . searchParams . append ( column , `neq.${ value } ` )
97
117
return this
@@ -269,9 +289,16 @@ export default class PostgrestFilterBuilder<
269
289
*/
270
290
in < ColumnName extends string > (
271
291
column : ColumnName ,
272
- values : ResolveFilterValue < Schema , Row , ColumnName > extends never
273
- ? unknown [ ]
274
- : ReadonlyArray < ResolveFilterValue < Schema , Row , ColumnName > >
292
+ values : ReadonlyArray <
293
+ ResolveFilterValue < Schema , Row , ColumnName > extends never
294
+ ? unknown
295
+ : // We want to infer the type before wrapping it into a `NonNullable` to avoid too deep
296
+ // type resolution error
297
+ ResolveFilterValue < Schema , Row , ColumnName > extends infer ResolvedFilterValue
298
+ ? ResolvedFilterValue
299
+ : // We should never enter this case as all the branches are covered above
300
+ never
301
+ >
275
302
) : this {
276
303
const cleanedValues = Array . from ( new Set ( values ) )
277
304
. map ( ( s ) => {
0 commit comments