@@ -858,7 +858,7 @@ describe('Execute: defer directive', () => {
858858 ] ) ;
859859 } ) ;
860860
861- it ( 'Initiates all deferred grouped field sets immediately if and only if they have been released as pending' , async ( ) => {
861+ it ( 'Initiates deferred grouped field sets only if they have been released as pending' , async ( ) => {
862862 const document = parse ( `
863863 query {
864864 ... @defer {
@@ -986,6 +986,125 @@ describe('Execute: defer directive', () => {
986986 } ) ;
987987 } ) ;
988988
989+ it ( 'Initiates all deferred grouped field sets immediately once they have been released as pending' , async ( ) => {
990+ const document = parse ( `
991+ query {
992+ ... @defer {
993+ a {
994+ ... @defer {
995+ b {
996+ c { d }
997+ }
998+ }
999+ }
1000+ }
1001+ ... @defer {
1002+ a {
1003+ ... @defer {
1004+ b {
1005+ c { d }
1006+ e { f }
1007+ }
1008+ }
1009+ }
1010+ }
1011+ }
1012+ ` ) ;
1013+
1014+ const { promise : cPromise , resolve : resolveC } =
1015+ // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
1016+ promiseWithResolvers < void > ( ) ;
1017+ let cResolverCalled = false ;
1018+ let eResolverCalled = false ;
1019+ const executeResult = experimentalExecuteIncrementally ( {
1020+ schema,
1021+ document,
1022+ rootValue : {
1023+ a : {
1024+ b : {
1025+ c : async ( ) => {
1026+ cResolverCalled = true ;
1027+ await cPromise ;
1028+ return { d : 'd' } ;
1029+ } ,
1030+ e : ( ) => {
1031+ eResolverCalled = true ;
1032+ return { f : 'f' } ;
1033+ } ,
1034+ } ,
1035+ } ,
1036+ } ,
1037+ enableEarlyExecution : false ,
1038+ } ) ;
1039+
1040+ assert ( 'initialResult' in executeResult ) ;
1041+
1042+ const result1 = executeResult . initialResult ;
1043+ expectJSON ( result1 ) . toDeepEqual ( {
1044+ data : { } ,
1045+ pending : [
1046+ { id : '0' , path : [ ] } ,
1047+ { id : '1' , path : [ ] } ,
1048+ ] ,
1049+ hasNext : true ,
1050+ } ) ;
1051+
1052+ const iterator = executeResult . subsequentResults [ Symbol . asyncIterator ] ( ) ;
1053+
1054+ expect ( cResolverCalled ) . to . equal ( false ) ;
1055+ expect ( eResolverCalled ) . to . equal ( false ) ;
1056+
1057+ const result2 = await iterator . next ( ) ;
1058+ expectJSON ( result2 ) . toDeepEqual ( {
1059+ value : {
1060+ pending : [
1061+ { id : '2' , path : [ 'a' ] } ,
1062+ { id : '3' , path : [ 'a' ] } ,
1063+ ] ,
1064+ incremental : [
1065+ {
1066+ data : { a : { } } ,
1067+ id : '0' ,
1068+ } ,
1069+ ] ,
1070+ completed : [ { id : '0' } , { id : '1' } ] ,
1071+ hasNext : true ,
1072+ } ,
1073+ done : false ,
1074+ } ) ;
1075+
1076+ resolveC ( ) ;
1077+
1078+ expect ( cResolverCalled ) . to . equal ( true ) ;
1079+ expect ( eResolverCalled ) . to . equal ( true ) ;
1080+
1081+ const result3 = await iterator . next ( ) ;
1082+ expectJSON ( result3 ) . toDeepEqual ( {
1083+ value : {
1084+ incremental : [
1085+ {
1086+ data : { b : { c : { d : 'd' } } } ,
1087+ id : '2' ,
1088+ } ,
1089+ {
1090+ data : { e : { f : 'f' } } ,
1091+ id : '3' ,
1092+ subPath : [ 'b' ] ,
1093+ } ,
1094+ ] ,
1095+ completed : [ { id : '2' } , { id : '3' } ] ,
1096+ hasNext : false ,
1097+ } ,
1098+ done : false ,
1099+ } ) ;
1100+
1101+ const result4 = await iterator . next ( ) ;
1102+ expectJSON ( result4 ) . toDeepEqual ( {
1103+ value : undefined ,
1104+ done : true ,
1105+ } ) ;
1106+ } ) ;
1107+
9891108 it ( 'Can deduplicate multiple defers on the same object' , async ( ) => {
9901109 const document = parse ( `
9911110 query {
0 commit comments