diff --git a/src/validation/rules/ExecutableDefinitionsRule.ts b/src/validation/rules/ExecutableDefinitionsRule.ts index c446e000e18..1a6c21a91f5 100644 --- a/src/validation/rules/ExecutableDefinitionsRule.ts +++ b/src/validation/rules/ExecutableDefinitionsRule.ts @@ -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, diff --git a/src/validation/rules/FieldsOnCorrectTypeRule.ts b/src/validation/rules/FieldsOnCorrectTypeRule.ts index 1b2e066042f..a0c9726646a 100644 --- a/src/validation/rules/FieldsOnCorrectTypeRule.ts +++ b/src/validation/rules/FieldsOnCorrectTypeRule.ts @@ -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, diff --git a/src/validation/rules/FragmentsOnCompositeTypesRule.ts b/src/validation/rules/FragmentsOnCompositeTypesRule.ts index 75f49158c7e..487984ea1e8 100644 --- a/src/validation/rules/FragmentsOnCompositeTypesRule.ts +++ b/src/validation/rules/FragmentsOnCompositeTypesRule.ts @@ -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, diff --git a/src/validation/rules/KnownArgumentNamesRule.ts b/src/validation/rules/KnownArgumentNamesRule.ts index d769fe49662..ab7471a1b6a 100644 --- a/src/validation/rules/KnownArgumentNamesRule.ts +++ b/src/validation/rules/KnownArgumentNamesRule.ts @@ -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 { diff --git a/src/validation/rules/KnownDirectivesRule.ts b/src/validation/rules/KnownDirectivesRule.ts index 652bdde186d..25a84e7a9c2 100644 --- a/src/validation/rules/KnownDirectivesRule.ts +++ b/src/validation/rules/KnownDirectivesRule.ts @@ -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, diff --git a/src/validation/rules/KnownFragmentNamesRule.ts b/src/validation/rules/KnownFragmentNamesRule.ts index 0f3412bb456..78fb2446847 100644 --- a/src/validation/rules/KnownFragmentNamesRule.ts +++ b/src/validation/rules/KnownFragmentNamesRule.ts @@ -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 { diff --git a/src/validation/rules/LoneAnonymousOperationRule.ts b/src/validation/rules/LoneAnonymousOperationRule.ts index 617c80639f2..07e0ac35d0b 100644 --- a/src/validation/rules/LoneAnonymousOperationRule.ts +++ b/src/validation/rules/LoneAnonymousOperationRule.ts @@ -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, diff --git a/src/validation/rules/NoFragmentCyclesRule.ts b/src/validation/rules/NoFragmentCyclesRule.ts index eb913917315..0a33f4508d1 100644 --- a/src/validation/rules/NoFragmentCyclesRule.ts +++ b/src/validation/rules/NoFragmentCyclesRule.ts @@ -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 { diff --git a/src/validation/rules/NoUndefinedVariablesRule.ts b/src/validation/rules/NoUndefinedVariablesRule.ts index de1a84807fa..36bfe049b44 100644 --- a/src/validation/rules/NoUndefinedVariablesRule.ts +++ b/src/validation/rules/NoUndefinedVariablesRule.ts @@ -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, diff --git a/src/validation/rules/NoUnusedFragmentsRule.ts b/src/validation/rules/NoUnusedFragmentsRule.ts index 393f783d728..2047945463b 100644 --- a/src/validation/rules/NoUnusedFragmentsRule.ts +++ b/src/validation/rules/NoUnusedFragmentsRule.ts @@ -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, diff --git a/src/validation/rules/NoUnusedVariablesRule.ts b/src/validation/rules/NoUnusedVariablesRule.ts index c58c390f0bc..b81fd078437 100644 --- a/src/validation/rules/NoUnusedVariablesRule.ts +++ b/src/validation/rules/NoUnusedVariablesRule.ts @@ -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 = []; diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index f60c86a56e0..e76b32f97c4 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -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, diff --git a/src/validation/rules/SingleFieldSubscriptionsRule.ts b/src/validation/rules/SingleFieldSubscriptionsRule.ts index 2d8fc39af23..74c0ef4af30 100644 --- a/src/validation/rules/SingleFieldSubscriptionsRule.ts +++ b/src/validation/rules/SingleFieldSubscriptionsRule.ts @@ -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, diff --git a/src/validation/rules/UniqueArgumentNamesRule.ts b/src/validation/rules/UniqueArgumentNamesRule.ts index 73289efd2f3..54b090c9403 100644 --- a/src/validation/rules/UniqueArgumentNamesRule.ts +++ b/src/validation/rules/UniqueArgumentNamesRule.ts @@ -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, diff --git a/src/validation/rules/UniqueDirectivesPerLocationRule.ts b/src/validation/rules/UniqueDirectivesPerLocationRule.ts index 85bea14969b..99639508d30 100644 --- a/src/validation/rules/UniqueDirectivesPerLocationRule.ts +++ b/src/validation/rules/UniqueDirectivesPerLocationRule.ts @@ -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, diff --git a/src/validation/rules/UniqueFragmentNamesRule.ts b/src/validation/rules/UniqueFragmentNamesRule.ts index 144e0e94d5e..47e129e1eeb 100644 --- a/src/validation/rules/UniqueFragmentNamesRule.ts +++ b/src/validation/rules/UniqueFragmentNamesRule.ts @@ -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, diff --git a/src/validation/rules/UniqueInputFieldNamesRule.ts b/src/validation/rules/UniqueInputFieldNamesRule.ts index cd6b1161c67..6aa585102d0 100644 --- a/src/validation/rules/UniqueInputFieldNamesRule.ts +++ b/src/validation/rules/UniqueInputFieldNamesRule.ts @@ -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, diff --git a/src/validation/rules/UniqueOperationNamesRule.ts b/src/validation/rules/UniqueOperationNamesRule.ts index 6051e919788..fb6b11cdddb 100644 --- a/src/validation/rules/UniqueOperationNamesRule.ts +++ b/src/validation/rules/UniqueOperationNamesRule.ts @@ -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, diff --git a/src/validation/rules/ValuesOfCorrectTypeRule.ts b/src/validation/rules/ValuesOfCorrectTypeRule.ts index 6d5dc5c1ca8..b6b21708846 100644 --- a/src/validation/rules/ValuesOfCorrectTypeRule.ts +++ b/src/validation/rules/ValuesOfCorrectTypeRule.ts @@ -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, diff --git a/src/validation/rules/VariablesAreInputTypesRule.ts b/src/validation/rules/VariablesAreInputTypesRule.ts index 61fce41e8a5..01db171a978 100644 --- a/src/validation/rules/VariablesAreInputTypesRule.ts +++ b/src/validation/rules/VariablesAreInputTypesRule.ts @@ -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, diff --git a/src/validation/rules/VariablesInAllowedPositionRule.ts b/src/validation/rules/VariablesInAllowedPositionRule.ts index bf4c8f8f7c7..c167a3c5e98 100644 --- a/src/validation/rules/VariablesInAllowedPositionRule.ts +++ b/src/validation/rules/VariablesInAllowedPositionRule.ts @@ -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,