@@ -31,6 +31,7 @@ import type {
31
31
GraphQLFieldResolver ,
32
32
GraphQLLeafType ,
33
33
GraphQLList ,
34
+ GraphQLNullableOutputType ,
34
35
GraphQLObjectType ,
35
36
GraphQLOutputType ,
36
37
GraphQLResolveInfo ,
@@ -822,36 +823,28 @@ function completeValue(
822
823
throw result ;
823
824
}
824
825
825
- // If field type is NonNull, complete for inner type, and throw field error
826
- // if result is null.
826
+ let nullableType : GraphQLNullableOutputType ;
827
827
if ( isNonNullType ( returnType ) ) {
828
- const completed = completeValue (
829
- exeContext ,
830
- returnType . ofType ,
831
- fieldGroup ,
832
- info ,
833
- path ,
834
- result ,
835
- incrementalDataRecord ,
836
- ) ;
837
- if ( completed === null ) {
828
+ // If result value is null or undefined then throw an error.
829
+ if ( result == null ) {
838
830
throw new Error (
839
831
`Cannot return null for non-nullable field ${ info . parentType . name } .${ info . fieldName } .` ,
840
832
) ;
841
833
}
842
- return completed ;
843
- }
844
-
845
- // If result value is null or undefined then return null.
846
- if ( result == null ) {
847
- return null ;
834
+ nullableType = returnType . ofType ;
835
+ } else {
836
+ // If result value is null or undefined then return null.
837
+ if ( result == null ) {
838
+ return null ;
839
+ }
840
+ nullableType = returnType ;
848
841
}
849
842
850
843
// If field type is List, complete each item in the list with the inner type
851
- if ( isListType ( returnType ) ) {
844
+ if ( isListType ( nullableType ) ) {
852
845
return completeListValue (
853
846
exeContext ,
854
- returnType ,
847
+ nullableType ,
855
848
fieldGroup ,
856
849
info ,
857
850
path ,
@@ -862,16 +855,16 @@ function completeValue(
862
855
863
856
// If field type is a leaf type, Scalar or Enum, serialize to a valid value,
864
857
// returning null if serialization is not possible.
865
- if ( isLeafType ( returnType ) ) {
866
- return completeLeafValue ( returnType , result ) ;
858
+ if ( isLeafType ( nullableType ) ) {
859
+ return completeLeafValue ( nullableType , result ) ;
867
860
}
868
861
869
862
// If field type is an abstract type, Interface or Union, determine the
870
863
// runtime Object type and complete for that type.
871
- if ( isAbstractType ( returnType ) ) {
864
+ if ( isAbstractType ( nullableType ) ) {
872
865
return completeAbstractValue (
873
866
exeContext ,
874
- returnType ,
867
+ nullableType ,
875
868
fieldGroup ,
876
869
info ,
877
870
path ,
@@ -881,10 +874,10 @@ function completeValue(
881
874
}
882
875
883
876
// If field type is Object, execute and complete all sub-selections.
884
- if ( isObjectType ( returnType ) ) {
877
+ if ( isObjectType ( nullableType ) ) {
885
878
return completeObjectValue (
886
879
exeContext ,
887
- returnType ,
880
+ nullableType ,
888
881
fieldGroup ,
889
882
info ,
890
883
path ,
@@ -896,7 +889,7 @@ function completeValue(
896
889
// Not reachable, all possible output types have been considered.
897
890
invariant (
898
891
false ,
899
- 'Cannot complete value of unexpected output type: ' + inspect ( returnType ) ,
892
+ 'Cannot complete value of unexpected output type: ' + inspect ( nullableType ) ,
900
893
) ;
901
894
}
902
895
0 commit comments