Skip to content

Commit b49c660

Browse files
committedJan 23, 2025·
fix: jsonpath accessor and filters
1 parent e7089f6 commit b49c660

File tree

3 files changed

+91
-21
lines changed

3 files changed

+91
-21
lines changed
 

‎src/PostgrestFilterBuilder.ts

+28-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import PostgrestTransformBuilder from './PostgrestTransformBuilder'
2+
import { JsonPathToAccessor, JsonPathToType } from './select-query-parser/utils'
23
import { GenericSchema } from './types'
34

45
type FilterOperator =
@@ -40,6 +41,12 @@ type ResolveFilterValue<
4041
: ResolveFilterRelationshipValue<Schema, RelationshipTable, Remainder>
4142
: ColumnName extends keyof Row
4243
? Row[ColumnName]
44+
: // If the column selection is a jsonpath like `data->value` we attempt to match
45+
// the expected type with the parsed custom json type
46+
JsonPathToType<Row, JsonPathToAccessor<ColumnName>> extends infer JsonPathValue
47+
? JsonPathValue extends never
48+
? never
49+
: JsonPathValue
4350
: never
4451

4552
type ResolveFilterRelationshipValue<
@@ -73,11 +80,14 @@ export default class PostgrestFilterBuilder<
7380
*/
7481
eq<ColumnName extends string>(
7582
column: ColumnName,
76-
value: ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue
77-
? ResolvedFilterValue extends never
78-
? unknown
79-
: NonNullable<ResolvedFilterValue>
80-
: unknown
83+
value: ResolveFilterValue<Schema, Row, ColumnName> extends never
84+
? NonNullable<unknown>
85+
: // We want to infer the type before wrapping it into a `NonNullable` to avoid too deep
86+
// type resolution error
87+
ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue
88+
? NonNullable<ResolvedFilterValue>
89+
: // We should never enter this case as all the branches are covered above
90+
never
8191
): this {
8292
this.url.searchParams.append(column, `eq.${value}`)
8393
return this
@@ -91,11 +101,11 @@ export default class PostgrestFilterBuilder<
91101
*/
92102
neq<ColumnName extends string>(
93103
column: ColumnName,
94-
value: ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue
95-
? ResolvedFilterValue extends never
96-
? unknown
97-
: NonNullable<ResolvedFilterValue>
98-
: unknown
104+
value: ResolveFilterValue<Schema, Row, ColumnName> extends never
105+
? unknown
106+
: ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue
107+
? ResolvedFilterValue
108+
: never
99109
): this {
100110
this.url.searchParams.append(column, `neq.${value}`)
101111
return this
@@ -274,11 +284,14 @@ export default class PostgrestFilterBuilder<
274284
in<ColumnName extends string>(
275285
column: ColumnName,
276286
values: ReadonlyArray<
277-
ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue
278-
? ResolvedFilterValue extends never
279-
? unknown[]
280-
: ResolvedFilterValue
281-
: never
287+
ResolveFilterValue<Schema, Row, ColumnName> extends never
288+
? unknown
289+
: // We want to infer the type before wrapping it into a `NonNullable` to avoid too deep
290+
// type resolution error
291+
ResolveFilterValue<Schema, Row, ColumnName> extends infer ResolvedFilterValue
292+
? ResolvedFilterValue
293+
: // We should never enter this case as all the branches are covered above
294+
never
282295
>
283296
): this {
284297
const cleanedValues = Array.from(new Set(values))

‎test/issue-1354-d.ts

+62
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,35 @@ const postgrestOverrideTypes = new PostgrestClient<DatabaseOverride>('http://loc
191191
expectType<null>(result.data)
192192
}
193193

194+
// basic types with postgres jsonpath selector
195+
{
196+
const res = await postgrest.from('foo').select('id, bar, baz').eq('bar->version', 31).single()
197+
198+
const bar = {} as Json
199+
const baz = {} as Json
200+
if (res.error) {
201+
throw new Error(res.error.message)
202+
}
203+
const result = await postgrest
204+
.from('foo')
205+
.update({
206+
bar,
207+
baz,
208+
})
209+
.eq('bar->version', 31)
210+
expectType<null>(result.data)
211+
const resIn = await postgrest
212+
.from('foo')
213+
.select('id, bar, baz')
214+
.in('bar->version', [1, 2])
215+
.single()
216+
217+
if (resIn.error) {
218+
throw new Error(resIn.error.message)
219+
}
220+
expectType<{ id: string; bar: Json; baz: Json }>(resIn.data)
221+
}
222+
194223
// extended types
195224
{
196225
const res = await postgrestOverrideTypes
@@ -226,3 +255,36 @@ const postgrestOverrideTypes = new PostgrestClient<DatabaseOverride>('http://loc
226255
}
227256
expectType<{ id: string; bar: Custom; baz: Custom }>(resIn.data)
228257
}
258+
259+
// extended types with postgres jsonpath selector
260+
{
261+
const res = await postgrestOverrideTypes
262+
.from('foo')
263+
.select('id, bar, baz')
264+
.eq('bar->version', 31)
265+
.single()
266+
267+
const bar = {} as Custom
268+
const baz = {} as Custom
269+
if (res.error) {
270+
throw new Error(res.error.message)
271+
}
272+
const result = await postgrestOverrideTypes
273+
.from('foo')
274+
.update({
275+
bar,
276+
baz,
277+
})
278+
.eq('bar->version', res.data.bar.version)
279+
expectType<null>(result.data)
280+
const resIn = await postgrestOverrideTypes
281+
.from('foo')
282+
.select('id, bar, baz')
283+
.in('bar->version', [1, 32])
284+
.single()
285+
286+
if (resIn.error) {
287+
throw new Error(resIn.error.message)
288+
}
289+
expectType<{ id: string; bar: Custom; baz: Custom }>(resIn.data)
290+
}

‎test/relationships.ts

+1-6
Original file line numberDiff line numberDiff line change
@@ -1830,12 +1830,7 @@ test('self reference relation via column', async () => {
18301830
})
18311831

18321832
test('aggregate on missing column with alias', async () => {
1833-
const res = await selectQueries.aggregateOnMissingColumnWithAlias
1834-
// @ts-expect-error should not be able to eq 'id' since the column does not
1835-
// exist
1836-
.eq('id', 2)
1837-
.limit(1)
1838-
.single()
1833+
const res = await selectQueries.aggregateOnMissingColumnWithAlias.eq('id', 2).limit(1).single()
18391834
expect(res).toMatchInlineSnapshot(`
18401835
Object {
18411836
"count": null,

0 commit comments

Comments
 (0)
Please sign in to comment.