/**
 * Validate GraphQL documents and schemas with the specified validation rules.
 *
 * These exports are also available from the root `graphql` package.
 * @packageDocumentation
 */

export { validate } from './validate.ts';
export type { ValidationOptions } from './validate.ts';

export { ValidationContext } from './ValidationContext.ts';
export type { ValidationRule } from './ValidationContext.ts';

// All validation rules in the GraphQL Specification.
export { specifiedRules, recommendedRules } from './specifiedRules.ts';

// Spec Section: "Defer And Stream Directive Labels Are Unique"
export { DeferStreamDirectiveLabelRule } from './rules/DeferStreamDirectiveLabelRule.ts';

// Spec Section: "Defer And Stream Directives Are Used On Valid Root Field"
export { DeferStreamDirectiveOnRootFieldRule } from './rules/DeferStreamDirectiveOnRootFieldRule.ts';

// Spec Section: "Defer And Stream Directives Are Used On Valid Operations"
export { DeferStreamDirectiveOnValidOperationsRule } from './rules/DeferStreamDirectiveOnValidOperationsRule.ts';

// Spec Section: "Executable Definitions"
export { ExecutableDefinitionsRule } from './rules/ExecutableDefinitionsRule.ts';

// Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"
export { FieldsOnCorrectTypeRule } from './rules/FieldsOnCorrectTypeRule.ts';

// Spec Section: "Fragments on Composite Types"
export { FragmentsOnCompositeTypesRule } from './rules/FragmentsOnCompositeTypesRule.ts';

// Spec Section: "Argument Names"
export { KnownArgumentNamesRule } from './rules/KnownArgumentNamesRule.ts';

// Spec Section: "Directives Are Defined"
export { KnownDirectivesRule } from './rules/KnownDirectivesRule.ts';

// Spec Section: "Fragment spread target defined"
export { KnownFragmentNamesRule } from './rules/KnownFragmentNamesRule.ts';

// Spec Section: "Operation Type Existence"
export { KnownOperationTypesRule } from './rules/KnownOperationTypesRule.ts';

// Spec Section: "Fragment Spread Type Existence"
export { KnownTypeNamesRule } from './rules/KnownTypeNamesRule.ts';

// Spec Section: "Lone Anonymous Operation"
export { LoneAnonymousOperationRule } from './rules/LoneAnonymousOperationRule.ts';

// Spec Section: "Fragments must not form cycles"
export { NoFragmentCyclesRule } from './rules/NoFragmentCyclesRule.ts';

// Spec Section: "All Variable Used Defined"
export { NoUndefinedVariablesRule } from './rules/NoUndefinedVariablesRule.ts';

// Spec Section: "Fragments must be used"
export { NoUnusedFragmentsRule } from './rules/NoUnusedFragmentsRule.ts';

// Spec Section: "All Variables Used"
export { NoUnusedVariablesRule } from './rules/NoUnusedVariablesRule.ts';

// Spec Section: "Field Selection Merging"
export { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBeMergedRule.ts';

// Spec Section: "Fragment spread is possible"
export { PossibleFragmentSpreadsRule } from './rules/PossibleFragmentSpreadsRule.ts';

// Spec Section: "Argument Optionality"
export { ProvidedRequiredArgumentsRule } from './rules/ProvidedRequiredArgumentsRule.ts';

// Spec Section: "Leaf Field Selections"
export { ScalarLeafsRule } from './rules/ScalarLeafsRule.ts';

// Spec Section: "Subscriptions with Single Root Field"
export { SingleFieldSubscriptionsRule } from './rules/SingleFieldSubscriptionsRule.ts';

// Spec Section: "Stream Directives Are Used On List Fields"
export { StreamDirectiveOnListFieldRule } from './rules/StreamDirectiveOnListFieldRule.ts';

// Spec Section: "Argument Uniqueness"
export { UniqueArgumentNamesRule } from './rules/UniqueArgumentNamesRule.ts';

// Spec Section: "Directives Are Unique Per Location"
export { UniqueDirectivesPerLocationRule } from './rules/UniqueDirectivesPerLocationRule.ts';

// Spec Section: "Fragment Name Uniqueness"
export { UniqueFragmentNamesRule } from './rules/UniqueFragmentNamesRule.ts';

// Spec Section: "Input Object Field Uniqueness"
export { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule.ts';

// Spec Section: "Operation Name Uniqueness"
export { UniqueOperationNamesRule } from './rules/UniqueOperationNamesRule.ts';

// Spec Section: "Variable Uniqueness"
export { UniqueVariableNamesRule } from './rules/UniqueVariableNamesRule.ts';

// Spec Section: "Values Type Correctness"
export { ValuesOfCorrectTypeRule } from './rules/ValuesOfCorrectTypeRule.ts';

// Spec Section: "Variables are Input Types"
export { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule.ts';

// Spec Section: "All Variable Usages Are Allowed"
export { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule.ts';

export { MaxIntrospectionDepthRule } from './rules/MaxIntrospectionDepthRule.ts';

// SDL-specific validation rules
export { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule.ts';
export { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule.ts';
export { UniqueTypeNamesRule } from './rules/UniqueTypeNamesRule.ts';
export { UniqueEnumValueNamesRule } from './rules/UniqueEnumValueNamesRule.ts';
export { UniqueFieldDefinitionNamesRule } from './rules/UniqueFieldDefinitionNamesRule.ts';
export { UniqueArgumentDefinitionNamesRule } from './rules/UniqueArgumentDefinitionNamesRule.ts';
export { UniqueDirectiveNamesRule } from './rules/UniqueDirectiveNamesRule.ts';
export { PossibleTypeExtensionsRule } from './rules/PossibleTypeExtensionsRule.ts';

// Optional rules not defined by the GraphQL Specification
export { NoDeprecatedCustomRule } from './rules/custom/NoDeprecatedCustomRule.ts';
export { NoSchemaIntrospectionCustomRule } from './rules/custom/NoSchemaIntrospectionCustomRule.ts';