@@ -26,10 +26,7 @@ const friendType = new GraphQLObjectType({
26
26
fields : {
27
27
id : { type : GraphQLID } ,
28
28
name : { type : GraphQLString } ,
29
- promiseNonNullErrorField : {
30
- type : new GraphQLNonNull ( GraphQLString ) ,
31
- resolve : ( ) => Promise . resolve ( null ) ,
32
- } ,
29
+ nonNullName : { type : new GraphQLNonNull ( GraphQLString ) } ,
33
30
} ,
34
31
name : 'Friend' ,
35
32
} ) ;
@@ -40,64 +37,36 @@ const friends = [
40
37
{ name : 'C-3PO' , id : 4 } ,
41
38
] ;
42
39
40
+ const hero = { name : 'Luke' , id : 1 , friends } ;
41
+
43
42
const heroType = new GraphQLObjectType ( {
44
43
fields : {
45
44
id : { type : GraphQLID } ,
46
45
name : { type : GraphQLString } ,
47
- slowField : {
48
- type : GraphQLString ,
49
- resolve : async ( ) => {
50
- await resolveOnNextTick ( ) ;
51
- return 'slow' ;
52
- } ,
53
- } ,
54
- errorField : {
55
- type : GraphQLString ,
56
- resolve : ( ) => {
57
- throw new Error ( 'bad' ) ;
58
- } ,
59
- } ,
60
- nonNullErrorField : {
61
- type : new GraphQLNonNull ( GraphQLString ) ,
62
- resolve : ( ) => null ,
63
- } ,
64
- promiseNonNullErrorField : {
65
- type : new GraphQLNonNull ( GraphQLString ) ,
66
- resolve : ( ) => Promise . resolve ( null ) ,
67
- } ,
46
+ nonNullName : { type : new GraphQLNonNull ( GraphQLString ) } ,
68
47
friends : {
69
48
type : new GraphQLList ( friendType ) ,
70
- resolve : ( ) => friends ,
71
- } ,
72
- asyncFriends : {
73
- type : new GraphQLList ( friendType ) ,
74
- async * resolve ( ) {
75
- yield await Promise . resolve ( friends [ 0 ] ) ;
76
- } ,
77
49
} ,
78
50
} ,
79
51
name : 'Hero' ,
80
52
} ) ;
81
53
82
- const hero = { name : 'Luke' , id : 1 } ;
83
-
84
54
const query = new GraphQLObjectType ( {
85
55
fields : {
86
56
hero : {
87
57
type : heroType ,
88
- resolve : ( ) => hero ,
89
58
} ,
90
59
} ,
91
60
name : 'Query' ,
92
61
} ) ;
93
62
94
63
const schema = new GraphQLSchema ( { query } ) ;
95
64
96
- async function complete ( document : DocumentNode ) {
65
+ async function complete ( document : DocumentNode , rootValue : unknown = { hero } ) {
97
66
const result = await experimentalExecuteIncrementally ( {
98
67
schema,
99
68
document,
100
- rootValue : { } ,
69
+ rootValue,
101
70
} ) ;
102
71
103
72
if ( 'initialResult' in result ) {
@@ -244,11 +213,18 @@ describe('Execute: defer directive', () => {
244
213
}
245
214
fragment QueryFragment on Query {
246
215
hero {
247
- errorField
216
+ name
248
217
}
249
218
}
250
219
` ) ;
251
- const result = await complete ( document ) ;
220
+ const result = await complete ( document , {
221
+ hero : {
222
+ ...hero ,
223
+ name : ( ) => {
224
+ throw new Error ( 'bad' ) ;
225
+ } ,
226
+ } ,
227
+ } ) ;
252
228
253
229
expectJSON ( result ) . toDeepEqual ( [
254
230
{
@@ -260,14 +236,14 @@ describe('Execute: defer directive', () => {
260
236
{
261
237
data : {
262
238
hero : {
263
- errorField : null ,
239
+ name : null ,
264
240
} ,
265
241
} ,
266
242
errors : [
267
243
{
268
244
message : 'bad' ,
269
245
locations : [ { line : 7 , column : 11 } ] ,
270
- path : [ 'hero' , 'errorField ' ] ,
246
+ path : [ 'hero' , 'name ' ] ,
271
247
} ,
272
248
] ,
273
249
path : [ ] ,
@@ -440,10 +416,17 @@ describe('Execute: defer directive', () => {
440
416
}
441
417
}
442
418
fragment NameFragment on Hero {
443
- errorField
419
+ name
444
420
}
445
421
` ) ;
446
- const result = await complete ( document ) ;
422
+ const result = await complete ( document , {
423
+ hero : {
424
+ ...hero ,
425
+ name : ( ) => {
426
+ throw new Error ( 'bad' ) ;
427
+ } ,
428
+ } ,
429
+ } ) ;
447
430
expectJSON ( result ) . toDeepEqual ( [
448
431
{
449
432
data : { hero : { id : '1' } } ,
@@ -452,13 +435,13 @@ describe('Execute: defer directive', () => {
452
435
{
453
436
incremental : [
454
437
{
455
- data : { errorField : null } ,
438
+ data : { name : null } ,
456
439
path : [ 'hero' ] ,
457
440
errors : [
458
441
{
459
442
message : 'bad' ,
460
443
locations : [ { line : 9 , column : 9 } ] ,
461
- path : [ 'hero' , 'errorField ' ] ,
444
+ path : [ 'hero' , 'name ' ] ,
462
445
} ,
463
446
] ,
464
447
} ,
@@ -476,10 +459,15 @@ describe('Execute: defer directive', () => {
476
459
}
477
460
}
478
461
fragment NameFragment on Hero {
479
- nonNullErrorField
462
+ nonNullName
480
463
}
481
464
` ) ;
482
- const result = await complete ( document ) ;
465
+ const result = await complete ( document , {
466
+ hero : {
467
+ ...hero ,
468
+ nonNullName : ( ) => null ,
469
+ } ,
470
+ } ) ;
483
471
expectJSON ( result ) . toDeepEqual ( [
484
472
{
485
473
data : { hero : { id : '1' } } ,
@@ -493,9 +481,9 @@ describe('Execute: defer directive', () => {
493
481
errors : [
494
482
{
495
483
message :
496
- 'Cannot return null for non-nullable field Hero.nonNullErrorField .' ,
484
+ 'Cannot return null for non-nullable field Hero.nonNullName .' ,
497
485
locations : [ { line : 9 , column : 9 } ] ,
498
- path : [ 'hero' , 'nonNullErrorField ' ] ,
486
+ path : [ 'hero' , 'nonNullName ' ] ,
499
487
} ,
500
488
] ,
501
489
} ,
@@ -508,27 +496,32 @@ describe('Execute: defer directive', () => {
508
496
const document = parse ( `
509
497
query HeroNameQuery {
510
498
hero {
511
- nonNullErrorField
499
+ nonNullName
512
500
...NameFragment @defer
513
501
}
514
502
}
515
503
fragment NameFragment on Hero {
516
504
id
517
505
}
518
506
` ) ;
519
- const result = await complete ( document ) ;
507
+ const result = await complete ( document , {
508
+ hero : {
509
+ ...hero ,
510
+ nonNullName : ( ) => null ,
511
+ } ,
512
+ } ) ;
520
513
expectJSON ( result ) . toDeepEqual ( {
521
514
errors : [
522
515
{
523
516
message :
524
- 'Cannot return null for non-nullable field Hero.nonNullErrorField .' ,
517
+ 'Cannot return null for non-nullable field Hero.nonNullName .' ,
525
518
locations : [
526
519
{
527
520
line : 4 ,
528
521
column : 11 ,
529
522
} ,
530
523
] ,
531
- path : [ 'hero' , 'nonNullErrorField ' ] ,
524
+ path : [ 'hero' , 'nonNullName ' ] ,
532
525
} ,
533
526
] ,
534
527
data : {
@@ -545,10 +538,15 @@ describe('Execute: defer directive', () => {
545
538
}
546
539
}
547
540
fragment NameFragment on Hero {
548
- promiseNonNullErrorField
541
+ nonNullName
549
542
}
550
543
` ) ;
551
- const result = await complete ( document ) ;
544
+ const result = await complete ( document , {
545
+ hero : {
546
+ ...hero ,
547
+ nonNullName : ( ) => Promise . resolve ( null ) ,
548
+ } ,
549
+ } ) ;
552
550
expectJSON ( result ) . toDeepEqual ( [
553
551
{
554
552
data : { hero : { id : '1' } } ,
@@ -562,9 +560,9 @@ describe('Execute: defer directive', () => {
562
560
errors : [
563
561
{
564
562
message :
565
- 'Cannot return null for non-nullable field Hero.promiseNonNullErrorField .' ,
563
+ 'Cannot return null for non-nullable field Hero.nonNullName .' ,
566
564
locations : [ { line : 9 , column : 9 } ] ,
567
- path : [ 'hero' , 'promiseNonNullErrorField ' ] ,
565
+ path : [ 'hero' , 'nonNullName ' ] ,
568
566
} ,
569
567
] ,
570
568
} ,
@@ -582,7 +580,7 @@ describe('Execute: defer directive', () => {
582
580
}
583
581
}
584
582
fragment NameFragment on Hero {
585
- slowField
583
+ name
586
584
friends {
587
585
...NestedFragment @defer
588
586
}
@@ -591,7 +589,15 @@ describe('Execute: defer directive', () => {
591
589
name
592
590
}
593
591
` ) ;
594
- const result = await complete ( document ) ;
592
+ const result = await complete ( document , {
593
+ hero : {
594
+ ...hero ,
595
+ name : async ( ) => {
596
+ await resolveOnNextTick ( ) ;
597
+ return 'slow' ;
598
+ } ,
599
+ } ,
600
+ } ) ;
595
601
expectJSON ( result ) . toDeepEqual ( [
596
602
{
597
603
data : {
@@ -602,7 +608,7 @@ describe('Execute: defer directive', () => {
602
608
{
603
609
incremental : [
604
610
{
605
- data : { slowField : 'slow' , friends : [ { } , { } , { } ] } ,
611
+ data : { name : 'slow' , friends : [ { } , { } , { } ] } ,
606
612
path : [ 'hero' ] ,
607
613
} ,
608
614
] ,
@@ -671,8 +677,8 @@ describe('Execute: defer directive', () => {
671
677
const document = parse ( `
672
678
query {
673
679
hero {
674
- asyncFriends {
675
- promiseNonNullErrorField
680
+ friends {
681
+ nonNullName
676
682
...NameFragment @defer
677
683
}
678
684
}
@@ -681,19 +687,29 @@ describe('Execute: defer directive', () => {
681
687
name
682
688
}
683
689
` ) ;
684
- const result = await complete ( document ) ;
690
+ const result = await complete ( document , {
691
+ hero : {
692
+ ...hero ,
693
+ async * friends ( ) {
694
+ yield await Promise . resolve ( {
695
+ ...friends [ 0 ] ,
696
+ nonNullName : ( ) => Promise . resolve ( null ) ,
697
+ } ) ;
698
+ } ,
699
+ } ,
700
+ } ) ;
685
701
expectJSON ( result ) . toDeepEqual ( {
686
702
data : {
687
703
hero : {
688
- asyncFriends : [ null ] ,
704
+ friends : [ null ] ,
689
705
} ,
690
706
} ,
691
707
errors : [
692
708
{
693
709
message :
694
- 'Cannot return null for non-nullable field Friend.promiseNonNullErrorField .' ,
710
+ 'Cannot return null for non-nullable field Friend.nonNullName .' ,
695
711
locations : [ { line : 5 , column : 11 } ] ,
696
- path : [ 'hero' , 'asyncFriends ' , 0 , 'promiseNonNullErrorField ' ] ,
712
+ path : [ 'hero' , 'friends ' , 0 , 'nonNullName ' ] ,
697
713
} ,
698
714
] ,
699
715
} ) ;
@@ -719,15 +735,23 @@ describe('Execute: defer directive', () => {
719
735
it ( 'original execute function resolves to error if anything is deferred and something else is async' , async ( ) => {
720
736
const doc = `
721
737
query Deferred {
722
- hero { slowField }
738
+ hero { name }
723
739
... @defer { hero { id } }
724
740
}
725
741
` ;
726
742
await expectPromise (
727
743
execute ( {
728
744
schema,
729
745
document : parse ( doc ) ,
730
- rootValue : { } ,
746
+ rootValue : {
747
+ hero : {
748
+ ...hero ,
749
+ name : async ( ) => {
750
+ await resolveOnNextTick ( ) ;
751
+ return 'slow' ;
752
+ } ,
753
+ } ,
754
+ } ,
731
755
} ) ,
732
756
) . toRejectWith (
733
757
'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)' ,
0 commit comments