1
1
// // @ts -nocheck
2
2
import {
3
3
CommonIdentifiers ,
4
+ isFilterByHookPayload ,
5
+ isFilterByValuePayload ,
6
+ isFindByHookPayload ,
7
+ isFindByValuePayload ,
4
8
isMapByHookPayload ,
5
9
isMapByPathPayload ,
6
10
JoshProvider ,
@@ -12,7 +16,7 @@ import {
12
16
} from '@joshdb/provider' ;
13
17
import { deleteProperty , getProperty , hasProperty , PROPERTY_NOT_FOUND , setProperty } from 'property-helpers' ;
14
18
import DbHandler from './DbHandler' ;
15
- import { handleSubCallFail } from './helpers' ;
19
+ import { handleSubCallFail , isPrimitive } from './helpers' ;
16
20
17
21
export class IndexedDBProvider < StoredValue = unknown > extends JoshProvider < StoredValue > {
18
22
public declare options : IndexedDBProvider . Options ;
@@ -370,13 +374,93 @@ export class IndexedDBProvider<StoredValue = unknown> extends JoshProvider<Store
370
374
public async [ Method . Filter ] ( payload : Payload . Filter . ByValue < StoredValue > ) : Promise < Payload . Filter . ByValue < StoredValue > > ;
371
375
public async [ Method . Filter ] ( payload : Payload . Filter < StoredValue > ) : Promise < Payload . Filter < StoredValue > > {
372
376
await this . check ( ) ;
377
+ payload . data = { } ;
378
+
379
+ if ( isFilterByHookPayload ( payload ) ) {
380
+ const { hook } = payload ;
381
+
382
+ for ( const [ key , value ] of Object . entries ( await this . db . getAll ( ) ) ) if ( await hook ( value , key ) ) payload . data [ key ] = value ;
383
+ }
384
+
385
+ if ( isFilterByValuePayload ( payload ) ) {
386
+ const { path, value } = payload ;
387
+
388
+ for ( const [ key , storedValue ] of Object . entries ( await this . db . getAll ( ) ) ) {
389
+ const data = getProperty ( storedValue , path , false ) ;
390
+
391
+ if ( data === PROPERTY_NOT_FOUND ) {
392
+ payload . errors . push ( this . error ( { identifier : CommonIdentifiers . MissingData , method : Method . Filter } , { key, path } ) ) ;
393
+
394
+ return payload ;
395
+ }
396
+
397
+ if ( ! isPrimitive ( data ) ) {
398
+ payload . errors . push ( this . error ( { identifier : CommonIdentifiers . InvalidDataType , method : Method . Filter } , { key, path, type : 'primitive' } ) ) ;
399
+
400
+ return payload ;
401
+ }
402
+
403
+ if ( data === value ) payload . data [ key ] = storedValue ;
404
+ }
405
+ }
406
+
373
407
return payload ;
374
408
}
375
409
376
410
public async [ Method . Find ] ( payload : Payload . Find . ByHook < StoredValue > ) : Promise < Payload . Find . ByHook < StoredValue > > ;
377
411
public async [ Method . Find ] ( payload : Payload . Find . ByValue < StoredValue > ) : Promise < Payload . Find . ByValue < StoredValue > > ;
378
412
public async [ Method . Find ] ( payload : Payload . Find < StoredValue > ) : Promise < Payload . Find < StoredValue > > {
379
413
await this . check ( ) ;
414
+ payload . data = [ null , null ] ;
415
+
416
+ if ( isFindByHookPayload ( payload ) ) {
417
+ const { hook } = payload ;
418
+
419
+ for ( const [ key , value ] of Object . entries ( await this . db . getAll ( ) ) ) {
420
+ const result = await hook ( value , key ) ;
421
+
422
+ if ( ! result ) continue ;
423
+
424
+ payload . data = [ key , value ] ;
425
+
426
+ break ;
427
+ }
428
+ }
429
+
430
+ if ( isFindByValuePayload ( payload ) ) {
431
+ const { path, value } = payload ;
432
+
433
+ if ( ! isPrimitive ( value ) ) {
434
+ payload . errors . push ( this . error ( { identifier : CommonIdentifiers . InvalidDataType , method : Method . Find } , { path, type : 'primitive' } ) ) ;
435
+
436
+ return payload ;
437
+ }
438
+
439
+ for ( const [ key , storedValue ] of Object . entries ( await this . db . getAll ( ) ) ) {
440
+ if ( payload . data [ 0 ] !== null && payload . data [ 1 ] !== null ) break ;
441
+
442
+ const data = getProperty ( storedValue , path , false ) ;
443
+
444
+ if ( data === PROPERTY_NOT_FOUND ) {
445
+ payload . errors . push ( this . error ( { identifier : CommonIdentifiers . MissingData , method : Method . Find } , { key, path } ) ) ;
446
+
447
+ return payload ;
448
+ }
449
+
450
+ if ( ! isPrimitive ( data ) ) {
451
+ payload . errors . push ( this . error ( { identifier : CommonIdentifiers . InvalidDataType , method : Method . Find } , { key, path, type : 'primitive' } ) ) ;
452
+
453
+ return payload ;
454
+ }
455
+
456
+ if ( data !== value ) continue ;
457
+
458
+ payload . data = [ key , storedValue ] ;
459
+
460
+ break ;
461
+ }
462
+ }
463
+
380
464
return payload ;
381
465
}
382
466
0 commit comments