@@ -28,16 +28,16 @@ export type FilterCommon = {
28
28
export type FilterByIndex = {
29
29
type : "indexEq" ;
30
30
enabled : boolean ;
31
- value ?: Value ;
31
+ value ?: JSONValue | Value ;
32
32
} ;
33
33
34
34
export type FilterByIndexRange = {
35
35
type : "indexRange" ;
36
36
enabled : boolean ;
37
37
lowerOp ?: "gte" | "gt" ;
38
- lowerValue ?: Value ;
38
+ lowerValue ?: JSONValue | Value ;
39
39
upperOp ?: "lte" | "lt" ;
40
- upperValue ?: Value ;
40
+ upperValue ?: JSONValue | Value ;
41
41
} ;
42
42
43
43
export type FilterByBuiltin = {
@@ -300,7 +300,9 @@ export function applyIndexFilters(
300
300
if ( filter . type === "indexEq" ) {
301
301
builder = builder . eq (
302
302
selectedIndex . fields [ i ] ,
303
- filter . value === UNDEFINED_PLACEHOLDER ? undefined : filter . value ,
303
+ filter . value === UNDEFINED_PLACEHOLDER
304
+ ? undefined
305
+ : jsonToConvexOrValue ( filter . value ) ,
304
306
) ;
305
307
} else {
306
308
if ( i !== enabledClauses . length - 1 ) {
@@ -311,15 +313,15 @@ export function applyIndexFilters(
311
313
selectedIndex . fields [ i ] ,
312
314
filter . lowerValue === UNDEFINED_PLACEHOLDER
313
315
? undefined
314
- : filter . lowerValue ,
316
+ : jsonToConvexOrValue ( filter . lowerValue ) ,
315
317
) ;
316
318
}
317
319
if ( filter . upperOp ) {
318
320
builder = builder [ filter . upperOp ] (
319
321
selectedIndex . fields [ i ] ,
320
322
filter . upperValue === UNDEFINED_PLACEHOLDER
321
323
? undefined
322
- : filter . upperValue ,
324
+ : jsonToConvexOrValue ( filter . upperValue ) ,
323
325
) ;
324
326
}
325
327
}
@@ -455,3 +457,30 @@ export function findIndexByName(
455
457
) : Index | undefined {
456
458
return indexes . find ( ( i ) => i . indexDescriptor === indexName ) ;
457
459
}
460
+
461
+ // If the value is not a valid JSON value, return the value as is.
462
+ function jsonToConvexOrValue (
463
+ value : JSONValue | Value | undefined ,
464
+ ) : Value | undefined {
465
+ if ( value === undefined ) {
466
+ return undefined ;
467
+ }
468
+ if ( isBigIntOrArrayBufferInValue ( value ) ) {
469
+ return value ;
470
+ }
471
+ try {
472
+ return jsonToConvex ( value ) ;
473
+ } catch ( e ) {
474
+ return value ;
475
+ }
476
+ }
477
+
478
+ // If the value has a bigint or array buffer in it, it's definitely not a JSONValue
479
+ function isBigIntOrArrayBufferInValue (
480
+ value : JSONValue | Value ,
481
+ ) : value is Value {
482
+ if ( Array . isArray ( value ) ) {
483
+ return value . some ( isBigIntOrArrayBufferInValue ) ;
484
+ }
485
+ return typeof value === "bigint" || value instanceof ArrayBuffer ;
486
+ }
0 commit comments