You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Detect uninhabitable input types formed by OneOf and non-OneOf cycles
Rework the circular references validation to detect input object types
that cannot be provided a finite value. This covers:
- Self-recursive OneOf types (e.g. input A @OneOf { a: A })
- Mixed OneOf/non-OneOf cycles with no escape path
- Standard non-null circular references (existing behavior preserved)
Rename algorithms to match spec terminology:
- InputObjectHasUnbreakableCycle (was InputObjectCanBeProvidedAFiniteValue)
- InputFieldTypeHasUnbreakableCycle (was FieldTypeCanBeProvidedAFiniteValue)
@@ -924,7 +924,7 @@ describe('Type System: Input Objects must have fields', () => {
924
924
expectJSON(validateSchema(schema)).toDeepEqual([
925
925
{
926
926
message:
927
-
'Invalid circular reference. The Input Object SomeInputObject references itself in the non-null field SomeInputObject.nonNullSelf.',
927
+
'Input Object SomeInputObject references itself via the required fields: SomeInputObject.nonNullSelf.',
928
928
locations: [{line: 7,column: 9}],
929
929
},
930
930
]);
@@ -952,13 +952,31 @@ describe('Type System: Input Objects must have fields', () => {
952
952
expectJSON(validateSchema(schema)).toDeepEqual([
953
953
{
954
954
message:
955
-
'Invalid circular reference. The Input Object SomeInputObject references itself via the non-null fields: SomeInputObject.startLoop, AnotherInputObject.nextInLoop, YetAnotherInputObject.closeLoop.',
955
+
'Input Object SomeInputObject references itself via the required fields: SomeInputObject.startLoop, AnotherInputObject.nextInLoop, YetAnotherInputObject.closeLoop.',
956
956
locations: [
957
957
{line: 7,column: 9},
958
958
{line: 11,column: 9},
959
959
{line: 15,column: 9},
960
960
],
961
961
},
962
+
{
963
+
message:
964
+
'Input Object AnotherInputObject references itself via the required fields: AnotherInputObject.nextInLoop, YetAnotherInputObject.closeLoop, SomeInputObject.startLoop.',
965
+
locations: [
966
+
{line: 11,column: 9},
967
+
{line: 15,column: 9},
968
+
{line: 7,column: 9},
969
+
],
970
+
},
971
+
{
972
+
message:
973
+
'Input Object YetAnotherInputObject references itself via the required fields: YetAnotherInputObject.closeLoop, SomeInputObject.startLoop, AnotherInputObject.nextInLoop.',
974
+
locations: [
975
+
{line: 15,column: 9},
976
+
{line: 7,column: 9},
977
+
{line: 11,column: 9},
978
+
],
979
+
},
962
980
]);
963
981
});
964
982
@@ -986,24 +1004,28 @@ describe('Type System: Input Objects must have fields', () => {
986
1004
expectJSON(validateSchema(schema)).toDeepEqual([
987
1005
{
988
1006
message:
989
-
'Invalid circular reference. The Input Object SomeInputObject references itself via the non-null fields: SomeInputObject.startLoop, AnotherInputObject.closeLoop.',
1007
+
'Input Object SomeInputObject references itself via the required fields: SomeInputObject.startLoop, AnotherInputObject.closeLoop.',
990
1008
locations: [
991
1009
{line: 7,column: 9},
992
1010
{line: 11,column: 9},
993
1011
],
994
1012
},
995
1013
{
996
1014
message:
997
-
'Invalid circular reference. The Input Object AnotherInputObject references itself via the non-null fields: AnotherInputObject.startSecondLoop, YetAnotherInputObject.closeSecondLoop.',
1015
+
'Input Object AnotherInputObject references itself via the required fields: AnotherInputObject.closeLoop, SomeInputObject.startLoop.',
998
1016
locations: [
999
-
{line: 12,column: 9},
1000
-
{line: 16,column: 9},
1017
+
{line: 11,column: 9},
1018
+
{line: 7,column: 9},
1001
1019
],
1002
1020
},
1003
1021
{
1004
1022
message:
1005
-
'Invalid circular reference. The Input Object YetAnotherInputObject references itself in the non-null field YetAnotherInputObject.nonNullSelf.',
1006
-
locations: [{line: 17,column: 9}],
1023
+
'Input Object YetAnotherInputObject references itself via the required fields: YetAnotherInputObject.closeSecondLoop, AnotherInputObject.closeLoop, SomeInputObject.startLoop.',
1024
+
locations: [
1025
+
{line: 16,column: 9},
1026
+
{line: 11,column: 9},
1027
+
{line: 7,column: 9},
1028
+
],
1007
1029
},
1008
1030
]);
1009
1031
});
@@ -2409,173 +2431,202 @@ describe('Type System: OneOf Input Object fields must be nullable', () => {
2409
2431
});
2410
2432
});
2411
2433
2412
-
describe('Type System: OneOf Input Objects must be inhabitable',()=>{
2434
+
describe('Type System: Input Objects must not have unbreakable cycles',()=>{
2413
2435
it('accepts a OneOf Input Object with a scalar field',()=>{
0 commit comments