11// // @ts -nocheck
22import {
33 CommonIdentifiers ,
4+ isFilterByHookPayload ,
5+ isFilterByValuePayload ,
6+ isFindByHookPayload ,
7+ isFindByValuePayload ,
48 isMapByHookPayload ,
59 isMapByPathPayload ,
610 JoshProvider ,
@@ -12,7 +16,7 @@ import {
1216} from '@joshdb/provider' ;
1317import { deleteProperty , getProperty , hasProperty , PROPERTY_NOT_FOUND , setProperty } from 'property-helpers' ;
1418import DbHandler from './DbHandler' ;
15- import { handleSubCallFail } from './helpers' ;
19+ import { handleSubCallFail , isPrimitive } from './helpers' ;
1620
1721export class IndexedDBProvider < StoredValue = unknown > extends JoshProvider < StoredValue > {
1822 public declare options : IndexedDBProvider . Options ;
@@ -370,13 +374,93 @@ export class IndexedDBProvider<StoredValue = unknown> extends JoshProvider<Store
370374 public async [ Method . Filter ] ( payload : Payload . Filter . ByValue < StoredValue > ) : Promise < Payload . Filter . ByValue < StoredValue > > ;
371375 public async [ Method . Filter ] ( payload : Payload . Filter < StoredValue > ) : Promise < Payload . Filter < StoredValue > > {
372376 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+
373407 return payload ;
374408 }
375409
376410 public async [ Method . Find ] ( payload : Payload . Find . ByHook < StoredValue > ) : Promise < Payload . Find . ByHook < StoredValue > > ;
377411 public async [ Method . Find ] ( payload : Payload . Find . ByValue < StoredValue > ) : Promise < Payload . Find . ByValue < StoredValue > > ;
378412 public async [ Method . Find ] ( payload : Payload . Find < StoredValue > ) : Promise < Payload . Find < StoredValue > > {
379413 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+
380464 return payload ;
381465 }
382466
0 commit comments