Repository navigation
A schema with all deprecated elements removed must itself be valid #1231
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -136,6 +136,9 @@ All types and directives defined within a schema must not have a name which | |
| begins with {"\_\_"} (two underscores), as this is used exclusively by GraphQL's | ||
| introspection system. | ||
|
|
||
| If a GraphQL schema contains any deprecated _schema element_, a copy of the | ||
| schema that omits all deprecated _schema element_ must itself be valid. | ||
|
|
||
| ### Root Operation Types | ||
|
|
||
| :: A schema defines the initial _root operation type_ for each kind of operation | ||
|
|
@@ -968,7 +971,6 @@ IsValidImplementation(type, implementedType): | |
| 2. Let {implementedFieldType} be the return type of {implementedField}. | ||
| 3. {IsValidImplementationFieldType(fieldType, implementedFieldType)} must | ||
| be {true}. | ||
| 6. If {field} is deprecated then {implementedField} must also be deprecated. | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. imho we should leave this in place though as an implementation of the new definition you've added above? I don't think the spec should leave various ways in which the subset-is-valid needs to be looked out for separately, I think removing this actually says something else-- that an interface field being deprecated may differ from the deprecation status of an implemented field? -- that could be a separate proposal if that's what we want to explore
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I'm not convinced the redundancy gives us enough value to justify it. One of the reasons that deprecating things (object types, etc) is so hard to do spec-wise is because of all the knock-on consequences (especially with the "at least one field" rules we have, until #1228/etc are merged). Removing all of that and replacing with "schema with all deprecated elements removed must be valid" is much much simpler; and it's really easy to build into a GraphQL implementation without having to implement each and every one of the rules that govern it individually: function assertSchemaIsValid(schema) {
// ... all other rules ...
const reducedSchema = removeDeprecatedElements(schema)
if (reducedSchema !== schema) assertSchemaIsValid(reducedSchema);
}Libraries might need to implement more logic to make sure that violations raise useful error messages, but since the error messages aren't specified currently I think this is a fair trade-off to make?
I had to read it carefully, but I don't think so - interface ImplementedType {
id: ID!
f: Int # implementedField
}
type Query implements ImplementedType {
id: ID!
f: Int # field
}This rule says: if field ( interface ImplementedType {
id: ID!
f: Int
}
type Query implements ImplementedType {
id: ID!
f: Int @deprecated(reason: "...")
}If we remove the deprecated elements ( Removing this rule would remove this potential confusion. |
||
|
|
||
| IsValidImplementationFieldType(fieldType, implementedFieldType): | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe: "A copy of a GraphQL schema that omits every deprecated schema element must itself be valid."
A schema with no deprecated elements will be trivially valid. Also making sure
_schema element_is pluralized correctly.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added the more verbose wording to avoid infinite loops such as
const isValid = schema => otherValidationRules(schema) && isValid(removeDeprecated(schema)). We can't (currently) pluralize keywords because it will break spec-md lookup.