Skip to content
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

Improve documentation of validation rules #3285

Merged
merged 1 commit into from Oct 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/validation/rules/ExecutableDefinitionsRule.ts
Expand Up @@ -11,6 +11,8 @@ import type { ASTValidationContext } from '../ValidationContext';
*
* A GraphQL document is only valid for execution if all definitions are either
* operation or fragment definitions.
*
* See https://spec.graphql.org/draft/#sec-Executable-Definitions
*/
export function ExecutableDefinitionsRule(
context: ASTValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/FieldsOnCorrectTypeRule.ts
Expand Up @@ -26,6 +26,8 @@ import type { ValidationContext } from '../ValidationContext';
*
* A GraphQL document is only valid if all fields selected are defined by the
* parent type, or are an allowed meta field such as __typename.
*
* See https://spec.graphql.org/draft/#sec-Field-Selections
*/
export function FieldsOnCorrectTypeRule(
context: ValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/FragmentsOnCompositeTypesRule.ts
Expand Up @@ -15,6 +15,8 @@ import type { ValidationContext } from '../ValidationContext';
* Fragments use a type condition to determine if they apply, since fragments
* can only be spread into a composite type (object, interface, or union), the
* type condition must also be a composite type.
*
* See https://spec.graphql.org/draft/#sec-Fragments-On-Composite-Types
*/
export function FragmentsOnCompositeTypesRule(
context: ValidationContext,
Expand Down
3 changes: 3 additions & 0 deletions src/validation/rules/KnownArgumentNamesRule.ts
Expand Up @@ -18,6 +18,9 @@ import type {
*
* A GraphQL field is only valid if all supplied arguments are defined by
* that field.
*
* See https://spec.graphql.org/draft/#sec-Argument-Names
* See https://spec.graphql.org/draft/#sec-Directives-Are-In-Valid-Locations
*/
export function KnownArgumentNamesRule(context: ValidationContext): ASTVisitor {
return {
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/KnownDirectivesRule.ts
Expand Up @@ -21,6 +21,8 @@ import type {
*
* A GraphQL document is only valid if all `@directives` are known by the
* schema and legally positioned.
*
* See https://spec.graphql.org/draft/#sec-Directives-Are-Defined
*/
export function KnownDirectivesRule(
context: ValidationContext | SDLValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/KnownFragmentNamesRule.ts
Expand Up @@ -9,6 +9,8 @@ import type { ValidationContext } from '../ValidationContext';
*
* A GraphQL document is only valid if all `...Fragment` fragment spreads refer
* to fragments defined in the same document.
*
* See https://spec.graphql.org/draft/#sec-Fragment-spread-target-defined
*/
export function KnownFragmentNamesRule(context: ValidationContext): ASTVisitor {
return {
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/KnownTypeNamesRule.ts
Expand Up @@ -24,6 +24,8 @@ import type {
*
* A GraphQL document is only valid if referenced types (specifically
* variable definitions and fragment conditions) are defined by the type schema.
*
* See https://spec.graphql.org/draft/#sec-Fragment-Spread-Type-Existence
*/
export function KnownTypeNamesRule(
context: ValidationContext | SDLValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/LoneAnonymousOperationRule.ts
Expand Up @@ -10,6 +10,8 @@ import type { ASTValidationContext } from '../ValidationContext';
*
* A GraphQL document is only valid if when it contains an anonymous operation
* (the query short-hand) that it contains only that one operation definition.
*
* See https://spec.graphql.org/draft/#sec-Lone-Anonymous-Operation
*/
export function LoneAnonymousOperationRule(
context: ASTValidationContext,
Expand Down
8 changes: 8 additions & 0 deletions src/validation/rules/NoFragmentCyclesRule.ts
Expand Up @@ -10,6 +10,14 @@ import type { ASTVisitor } from '../../language/visitor';

import type { ASTValidationContext } from '../ValidationContext';

/**
* No fragment cycles
*
* The graph of fragment spreads must not form any cycles including spreading itself.
* Otherwise an operation could infinitely spread or infinitely execute on cycles in the underlying data.
*
* See https://spec.graphql.org/draft/#sec-Fragment-spreads-must-not-form-cycles
*/
export function NoFragmentCyclesRule(
context: ASTValidationContext,
): ASTVisitor {
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/NoUndefinedVariablesRule.ts
Expand Up @@ -9,6 +9,8 @@ import type { ValidationContext } from '../ValidationContext';
*
* A GraphQL operation is only valid if all variables encountered, both directly
* and via fragment spreads, are defined by that operation.
*
* See https://spec.graphql.org/draft/#sec-All-Variable-Uses-Defined
*/
export function NoUndefinedVariablesRule(
context: ValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/NoUnusedFragmentsRule.ts
Expand Up @@ -13,6 +13,8 @@ import type { ASTValidationContext } from '../ValidationContext';
*
* A GraphQL document is only valid if all fragment definitions are spread
* within operations, or spread within other fragments spread within operations.
*
* See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-Used
*/
export function NoUnusedFragmentsRule(
context: ASTValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/NoUnusedVariablesRule.ts
Expand Up @@ -10,6 +10,8 @@ import type { ValidationContext } from '../ValidationContext';
*
* A GraphQL operation is only valid if all variables defined by an operation
* are used, either directly or within a spread fragment.
*
* See https://spec.graphql.org/draft/#sec-All-Variables-Used
*/
export function NoUnusedVariablesRule(context: ValidationContext): ASTVisitor {
let variableDefs: Array<VariableDefinitionNode> = [];
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/OverlappingFieldsCanBeMergedRule.ts
Expand Up @@ -53,6 +53,8 @@ function reasonMessage(reason: ConflictReasonMessage): string {
* A selection set is only valid if all fields (including spreading any
* fragments) either correspond to distinct response names or can be merged
* without ambiguity.
*
* See https://spec.graphql.org/draft/#sec-Field-Selection-Merging
*/
export function OverlappingFieldsCanBeMergedRule(
context: ValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/SingleFieldSubscriptionsRule.ts
Expand Up @@ -17,6 +17,8 @@ import type { ValidationContext } from '../ValidationContext';
*
* A GraphQL subscription is valid only if it contains a single root field and
* that root field is not an introspection field.
*
* See https://spec.graphql.org/draft/#sec-Single-root-field
*/
export function SingleFieldSubscriptionsRule(
context: ValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/UniqueArgumentNamesRule.ts
Expand Up @@ -8,6 +8,8 @@ import type { ASTValidationContext } from '../ValidationContext';
*
* A GraphQL field or directive is only valid if all supplied arguments are
* uniquely named.
*
* See https://spec.graphql.org/draft/#sec-Argument-Names
*/
export function UniqueArgumentNamesRule(
context: ASTValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/UniqueDirectivesPerLocationRule.ts
Expand Up @@ -19,6 +19,8 @@ import type {
*
* A GraphQL document is only valid if all non-repeatable directives at
* a given location are uniquely named.
*
* See https://spec.graphql.org/draft/#sec-Directives-Are-Unique-Per-Location
*/
export function UniqueDirectivesPerLocationRule(
context: ValidationContext | SDLValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/UniqueFragmentNamesRule.ts
Expand Up @@ -8,6 +8,8 @@ import type { ASTValidationContext } from '../ValidationContext';
* Unique fragment names
*
* A GraphQL document is only valid if all defined fragments have unique names.
*
* See https://spec.graphql.org/draft/#sec-Fragment-Name-Uniqueness
*/
export function UniqueFragmentNamesRule(
context: ASTValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/UniqueInputFieldNamesRule.ts
Expand Up @@ -13,6 +13,8 @@ import type { ASTValidationContext } from '../ValidationContext';
*
* A GraphQL input object value is only valid if all supplied fields are
* uniquely named.
*
* See https://spec.graphql.org/draft/#sec-Input-Object-Field-Uniqueness
*/
export function UniqueInputFieldNamesRule(
context: ASTValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/UniqueOperationNamesRule.ts
Expand Up @@ -8,6 +8,8 @@ import type { ASTValidationContext } from '../ValidationContext';
* Unique operation names
*
* A GraphQL document is only valid if all defined operations have unique names.
*
* See https://spec.graphql.org/draft/#sec-Operation-Name-Uniqueness
*/
export function UniqueOperationNamesRule(
context: ASTValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/ValuesOfCorrectTypeRule.ts
Expand Up @@ -26,6 +26,8 @@ import type { ValidationContext } from '../ValidationContext';
*
* A GraphQL document is only valid if all value literals are of the type
* expected at their position.
*
* See https://spec.graphql.org/draft/#sec-Values-of-Correct-Type
*/
export function ValuesOfCorrectTypeRule(
context: ValidationContext,
Expand Down
2 changes: 2 additions & 0 deletions src/validation/rules/VariablesAreInputTypesRule.ts
Expand Up @@ -15,6 +15,8 @@ import type { ValidationContext } from '../ValidationContext';
*
* A GraphQL operation is only valid if all the variables it defines are of
* input types (scalar, enum, or input object).
*
* See https://spec.graphql.org/draft/#sec-Variables-Are-Input-Types
*/
export function VariablesAreInputTypesRule(
context: ValidationContext,
Expand Down
6 changes: 5 additions & 1 deletion src/validation/rules/VariablesInAllowedPositionRule.ts
Expand Up @@ -17,7 +17,11 @@ import { isTypeSubTypeOf } from '../../utilities/typeComparators';
import type { ValidationContext } from '../ValidationContext';

/**
* Variables passed to field arguments conform to type
* Variables in allowed position
*
* Variable usages must be compatible with the arguments they are passed to.
*
* See https://spec.graphql.org/draft/#sec-All-Variable-Usages-are-Allowed
*/
export function VariablesInAllowedPositionRule(
context: ValidationContext,
Expand Down