@@ -372,7 +372,7 @@ export default class Controller<
372372 * Gets a snapshot (https://dataclient.io/docs/api/Snapshot)
373373 * @see https://dataclient.io/docs/api/Controller#snapshot
374374 */
375- snapshot = ( state : State < unknown > , fetchedAt ?: number ) : SnapshotInterface => {
375+ snapshot = ( state : State < unknown > , fetchedAt ?: number ) : Snapshot < unknown > => {
376376 return new Snapshot ( this , state , fetchedAt ) ;
377377 } ;
378378
@@ -451,6 +451,50 @@ export default class Controller<
451451 expiryStatus : ExpiryStatus ;
452452 expiresAt : number ;
453453 countRef : ( ) => ( ) => void ;
454+ } {
455+ // TODO: breaking: only return data
456+ return this . getResponseMeta ( endpoint , ...rest ) ;
457+ }
458+
459+ /**
460+ * Gets the (globally referentially stable) response for a given endpoint/args pair from state given.
461+ * @see https://dataclient.io/docs/api/Controller#getResponseMeta
462+ */
463+ getResponseMeta < E extends EndpointInterface > (
464+ endpoint : E ,
465+ ...rest :
466+ | readonly [ null , State < unknown > ]
467+ | readonly [ ...Parameters < E > , State < unknown > ]
468+ ) : {
469+ data : DenormalizeNullable < E [ 'schema' ] > ;
470+ expiryStatus : ExpiryStatus ;
471+ expiresAt : number ;
472+ countRef : ( ) => ( ) => void ;
473+ } ;
474+
475+ getResponseMeta <
476+ E extends Pick < EndpointInterface , 'key' | 'schema' | 'invalidIfStale' > ,
477+ > (
478+ endpoint : E ,
479+ ...rest : readonly [
480+ ...( readonly [ ...Parameters < E [ 'key' ] > ] | readonly [ null ] ) ,
481+ State < unknown > ,
482+ ]
483+ ) : {
484+ data : DenormalizeNullable < E [ 'schema' ] > ;
485+ expiryStatus : ExpiryStatus ;
486+ expiresAt : number ;
487+ countRef : ( ) => ( ) => void ;
488+ } ;
489+
490+ getResponseMeta (
491+ endpoint : EndpointInterface ,
492+ ...rest : readonly [ ...unknown [ ] , State < unknown > ]
493+ ) : {
494+ data : unknown ;
495+ expiryStatus : ExpiryStatus ;
496+ expiresAt : number ;
497+ countRef : ( ) => ( ) => void ;
454498 } {
455499 const state = rest [ rest . length - 1 ] as State < unknown > ;
456500 // this is typescript generics breaking
@@ -548,6 +592,52 @@ export default class Controller<
548592 return this . memo . query ( schema , args , state . entities as any , state . indexes ) ;
549593 }
550594
595+ /**
596+ * Queries the store for a Querable schema; providing related metadata
597+ * @see https://dataclient.io/docs/api/Controller#getQueryMeta
598+ */
599+ getQueryMeta < S extends Queryable > (
600+ schema : S ,
601+ ...rest : readonly [
602+ ...SchemaArgs < S > ,
603+ Pick < State < unknown > , 'entities' | 'entityMeta' > ,
604+ ]
605+ ) : {
606+ data : DenormalizeNullable < S > | undefined ;
607+ countRef : ( ) => ( ) => void ;
608+ } {
609+ const state = rest [ rest . length - 1 ] as State < any > ;
610+ // this is typescript generics breaking
611+ const args : any = rest
612+ . slice ( 0 , rest . length - 1 )
613+ . map ( ensurePojo ) as SchemaArgs < S > ;
614+
615+ // TODO: breaking: Switch back to this.memo.query(schema, args, state.entities as any, state.indexes) to do
616+ // this logic
617+ const input = this . memo . buildQueryKey (
618+ schema ,
619+ args ,
620+ state . entities as any ,
621+ state . indexes ,
622+ JSON . stringify ( args ) ,
623+ ) ;
624+
625+ if ( ! input ) {
626+ return { data : undefined , countRef : ( ) => ( ) => undefined } ;
627+ }
628+
629+ const { data, paths } = this . memo . denormalize (
630+ schema ,
631+ input ,
632+ state . entities ,
633+ args ,
634+ ) ;
635+ return {
636+ data : typeof data === 'symbol' ? undefined : ( data as any ) ,
637+ countRef : this . gcPolicy . createCountRef ( { paths } ) ,
638+ } ;
639+ }
640+
551641 private getSchemaResponse < T > (
552642 data : T ,
553643 key : string ,
@@ -689,6 +779,49 @@ class Snapshot<T = unknown> implements SnapshotInterface {
689779 return this . controller . getResponse ( endpoint , ...args , this . state ) ;
690780 }
691781
782+ /** @see https://dataclient.io/docs/api/Snapshot#getResponseMeta */
783+ getResponseMeta < E extends EndpointInterface > (
784+ endpoint : E ,
785+ ...args : readonly [ null ]
786+ ) : {
787+ data : DenormalizeNullable < E [ 'schema' ] > ;
788+ expiryStatus : ExpiryStatus ;
789+ expiresAt : number ;
790+ } ;
791+
792+ getResponseMeta < E extends EndpointInterface > (
793+ endpoint : E ,
794+ ...args : readonly [ ...Parameters < E > ]
795+ ) : {
796+ data : DenormalizeNullable < E [ 'schema' ] > ;
797+ expiryStatus : ExpiryStatus ;
798+ expiresAt : number ;
799+ } ;
800+
801+ getResponseMeta <
802+ E extends Pick < EndpointInterface , 'key' | 'schema' | 'invalidIfStale' > ,
803+ > (
804+ endpoint : E ,
805+ ...args : readonly [ ...Parameters < E [ 'key' ] > ] | readonly [ null ]
806+ ) : {
807+ data : DenormalizeNullable < E [ 'schema' ] > ;
808+ expiryStatus : ExpiryStatus ;
809+ expiresAt : number ;
810+ } ;
811+
812+ getResponseMeta <
813+ E extends Pick < EndpointInterface , 'key' | 'schema' | 'invalidIfStale' > ,
814+ > (
815+ endpoint : E ,
816+ ...args : readonly [ ...Parameters < E [ 'key' ] > ] | readonly [ null ]
817+ ) : {
818+ data : DenormalizeNullable < E [ 'schema' ] > ;
819+ expiryStatus : ExpiryStatus ;
820+ expiresAt : number ;
821+ } {
822+ return this . controller . getResponseMeta ( endpoint , ...args , this . state ) ;
823+ }
824+
692825 /** @see https://dataclient.io/docs/api/Snapshot#getError */
693826 getError < E extends EndpointInterface > (
694827 endpoint : E ,
@@ -717,4 +850,18 @@ class Snapshot<T = unknown> implements SnapshotInterface {
717850 ) : DenormalizeNullable < S > | undefined {
718851 return this . controller . get ( schema , ...args , this . state ) ;
719852 }
853+
854+ /**
855+ * Queries the store for a Querable schema; providing related metadata
856+ * @see https://dataclient.io/docs/api/Snapshot#getQueryMeta
857+ */
858+ getQueryMeta < S extends Queryable > (
859+ schema : S ,
860+ ...args : SchemaArgs < S >
861+ ) : {
862+ data : DenormalizeNullable < S > | undefined ;
863+ countRef : ( ) => ( ) => void ;
864+ } {
865+ return this . controller . getQueryMeta ( schema , ...args , this . state ) ;
866+ }
720867}
0 commit comments