-
Notifications
You must be signed in to change notification settings - Fork 9
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
Adds Enum Type Default Value Uses Inaccessible Value Rule #47
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 | ||||
---|---|---|---|---|---|---|
|
@@ -14,6 +14,111 @@ run in sequence to produce the composite execution schema. | |||||
|
||||||
### Pre Merge Validation | ||||||
|
||||||
#### Enum Type Default Value Uses Inaccessible Value | ||||||
|
||||||
**Error Code** | ||||||
|
||||||
`ENUM_TYPE_DEFAULT_VALUE_INACCESSIBLE` | ||||||
|
||||||
**Formal Specification** | ||||||
|
||||||
- {ValidateArgumentDefaultValues()} must be true. | ||||||
- {ValidateInputFieldDefaultValues()} must be true. | ||||||
|
||||||
ValidateArgumentDefaultValues(): | ||||||
|
||||||
- Let {arguments} be all arguments of fields and directives across all subgraphs | ||||||
- For each {argument} in {arguments} | ||||||
- If {IsExposed(argument)} is true and has a default value: | ||||||
- Let {defaultValue} be the default value of {argument} | ||||||
- If not ValidateDefaultValue(defaultValue) | ||||||
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.
Suggested change
|
||||||
- return false | ||||||
- return true | ||||||
|
||||||
ValidateInputFieldDefaultValues(): | ||||||
|
||||||
- Let {inputFields} be all input fields of across all subgraphs | ||||||
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.
Suggested change
|
||||||
- For each {inputField} in {inputFields}: | ||||||
- Let {type} be the type of {inputField} | ||||||
- If {IsExposed(inputField)} is true and {inputField} has a default value: | ||||||
- Let {defaultValue} be the default value of {inputField} | ||||||
- if ValidateDefaultValue(defaultValue) is false | ||||||
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.
Suggested change
|
||||||
- return false | ||||||
- return true | ||||||
|
||||||
ValidateDefaultValue(defaultValue): | ||||||
|
||||||
- If {defaultValue} is a ListValue: | ||||||
- For each {valueNode} in {defaultValue}: | ||||||
- If {ValidateDefaultValue(valueNode)} is false | ||||||
- return false | ||||||
- If {defaultValue} is an ObjectValue: | ||||||
- Let {objectFields} be a list of all fields of {defaultValue} | ||||||
- Let {fields} be a list of all fields {objectFields} are referring to | ||||||
- For each {field} in {fields}: | ||||||
- If {IsExposed(field)} is false | ||||||
- return false | ||||||
- For each {objectField} in {objectFields}: | ||||||
- Let {value} be the value of {objectField} | ||||||
- return {ValidateDefaultValue(value)} | ||||||
- If {defaultValue} is an EnumValue: | ||||||
- If {IsExposed(defaultValue)} is false | ||||||
- return false | ||||||
- return true | ||||||
|
||||||
**Explanatory Text** | ||||||
|
||||||
This rule ensures that inaccessible enum values are not exposed in the composed schema through default values. | ||||||
Output field arguments, input fields and directive arguments must only use enum values as their default value that is not annotated with the `@inaccessible` directive. | ||||||
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.
Suggested change
|
||||||
|
||||||
In this example the `FOO` value in the `Enum1` enum is not marked with | ||||||
`@inaccessible`, hence it doesn't violate the rule. | ||||||
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.
Suggested change
|
||||||
|
||||||
```graphql | ||||||
type Query { | ||||||
field(type: Enum1 = FOO): [Baz!]! | ||||||
} | ||||||
|
||||||
enum Enum1 { | ||||||
FOO | ||||||
BAR | ||||||
} | ||||||
``` | ||||||
|
||||||
This following example violates this rule because the default value for the field | ||||||
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.
Suggested change
|
||||||
`field` in type `Input1` references an enum value (`FOO`) that is marked as | ||||||
`@inaccessible`. | ||||||
|
||||||
```graphql counter-example | ||||||
type Query { | ||||||
field(arg: Enum1 = FOO): [Baz!]! | ||||||
} | ||||||
|
||||||
input Input1 { | ||||||
field: Enum1 = FOO | ||||||
} | ||||||
|
||||||
directive @directive1(arg: Enum1 = FOO) on FIELD_DEFINITION | ||||||
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. Should this be removed or described? It's not part of the example description above, and also not in the "good" example. (same in the next counter-example) |
||||||
|
||||||
enum Enum1 { | ||||||
FOO @inaccessible | ||||||
BAR | ||||||
} | ||||||
``` | ||||||
|
||||||
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. Missing description of counter-example. |
||||||
```graphql counter-example | ||||||
type Query { | ||||||
field(arg: Input1 = { field2: "ERROR" }): [Baz!]! | ||||||
} | ||||||
|
||||||
directive @directive1(arg: Input1 = { field2: "ERROR" }) on FIELD_DEFINITION | ||||||
|
||||||
input Input1 { | ||||||
field1: String | ||||||
field2: String @inaccessible | ||||||
} | ||||||
``` | ||||||
|
||||||
### Merge | ||||||
|
||||||
### Post Merge Validation | ||||||
|
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.