Skip to main content

Disallow non-breakable chains of circular references in Input Objects

At a glance

Timeline


This was already discussed in Issue #189

Input Objects are allowed to reference other Input Objects. A circular reference occurs when an Input Object references itself either directly or through subordinated Input Objects.

Circular references are generally allowed, however they may not be defined as an unbroken chain of Non-Null fields. Such Input Objects are invalid, because there is no way to provide a legal value for them.

The following examples are allowed:

input Example {
self: Example
value: String
}

This is fine because a value for self may simply be omitted from the arguments.

input Example {
self: [Example!]!
value: String
}

This also works as self can just contain an empty list.

The following examples are invalid:

input Example {
value: String
self: Example!
}
input First {
second: Second!
value: String
}

input Second {
first: First!
value: String
}

The following example shows why no possible value can be provided:

{
someField(input: {
value: "val"
# self is required
self: {
value: "nextval"
# self is still required
self: {
# We would have to recurse down infinitely
...
}
}
})
}