@@ -573,4 +573,99 @@ describe("prepareListQuery", () => {
573573 } )
574574 } )
575575 } )
576+
577+ describe ( "disallowed fields" , ( ) => {
578+ it ( "should strip a disallowed top-level relation and its entire subtree" , async ( ) => {
579+ const validated : RequestQueryFields = {
580+ fields : "id,orders.email,orders.customer.first_name" ,
581+ limit : 10 ,
582+ offset : 0 ,
583+ }
584+
585+ const queryConfig : QueryConfig < any > = {
586+ entity : "region" ,
587+ disallowed : [ "orders" , "customer" ] ,
588+ isList : true ,
589+ }
590+
591+ const result = await prepareListQuery ( validated , queryConfig )
592+
593+ expect ( result . remoteQueryConfig . fields ) . toEqual ( [ "id" ] )
594+ } )
595+
596+ it ( "should strip a disallowed segment appearing at any depth" , async ( ) => {
597+ const validated : RequestQueryFields = {
598+ fields : "id,variants.order_items.order.total" ,
599+ limit : 10 ,
600+ offset : 0 ,
601+ }
602+
603+ const queryConfig : QueryConfig < any > = {
604+ entity : "product" ,
605+ disallowed : [ "order_items" ] ,
606+ isList : true ,
607+ }
608+
609+ const result = await prepareListQuery ( validated , queryConfig )
610+
611+ expect ( result . remoteQueryConfig . fields ) . toEqual ( [ "id" ] )
612+ } )
613+
614+ it ( "should strip disallowed star fields" , async ( ) => {
615+ const validated : RequestQueryFields = {
616+ fields : "id,*orders" ,
617+ limit : 10 ,
618+ offset : 0 ,
619+ }
620+
621+ const queryConfig : QueryConfig < any > = {
622+ entity : "region" ,
623+ disallowed : [ "orders" ] ,
624+ isList : true ,
625+ }
626+
627+ const result = await prepareListQuery ( validated , queryConfig )
628+
629+ expect ( result . remoteQueryConfig . fields ) . toEqual ( [ "id" ] )
630+ } )
631+
632+ it ( "should keep allowed fields that only share a prefix with a disallowed segment" , async ( ) => {
633+ const validated : RequestQueryFields = {
634+ fields : "id,order_id,customer_id" ,
635+ limit : 10 ,
636+ offset : 0 ,
637+ }
638+
639+ const queryConfig : QueryConfig < any > = {
640+ entity : "order" ,
641+ disallowed : [ "orders" , "customer" ] ,
642+ isList : true ,
643+ }
644+
645+ const result = await prepareListQuery ( validated , queryConfig )
646+
647+ expect ( result . remoteQueryConfig . fields ) . toEqual ( [
648+ "id" ,
649+ "order_id" ,
650+ "customer_id" ,
651+ ] )
652+ } )
653+
654+ it ( "should not remove anything when no disallowed fields are configured" , async ( ) => {
655+ const validated : RequestQueryFields = {
656+ fields : "id,orders.email" ,
657+ limit : 10 ,
658+ offset : 0 ,
659+ }
660+
661+ const queryConfig : QueryConfig < any > = {
662+ entity : "region" ,
663+ isList : true ,
664+ }
665+
666+ const result = await prepareListQuery ( validated , queryConfig )
667+
668+ expect ( result . remoteQueryConfig . fields ) . toEqual ( [ "id" , "orders.email" ] )
669+ } )
670+ } )
576671} )
0 commit comments