From 202ed3a96dabf1121282505fed59de875ecbf077 Mon Sep 17 00:00:00 2001 From: Firede Date: Sun, 2 Sep 2018 19:15:35 +0800 Subject: [PATCH] Update to graphql v14.0.0 Update to v14.0.0 from v14.0.0-rc.2, diff: https://github.com/graphql/graphql-js/compare/9b7807a8ff20c6f2565577af8d90530acc49230d...v14.0.0 --- types/graphql/error/GraphQLError.d.ts | 2 +- types/graphql/execution/values.d.ts | 2 +- types/graphql/graphql.d.ts | 5 +++ types/graphql/index.d.ts | 20 +++++++++-- types/graphql/language/ast.d.ts | 1 + types/graphql/language/directiveLocation.d.ts | 1 + types/graphql/language/index.d.ts | 12 +++++++ types/graphql/language/kinds.d.ts | 2 +- types/graphql/language/parser.d.ts | 11 ++++++ types/graphql/language/predicates.d.ts | 19 ++++++++++ types/graphql/type/definition.d.ts | 36 +++++++++++-------- types/graphql/type/index.d.ts | 5 +++ types/graphql/type/schema.d.ts | 3 +- types/graphql/utilities/buildASTSchema.d.ts | 11 +++++- types/graphql/utilities/coerceValue.d.ts | 2 +- types/graphql/utilities/extendSchema.d.ts | 8 +++++ .../utilities/findBreakingChanges.d.ts | 12 +++---- types/graphql/utilities/index.d.ts | 9 ++++- .../utilities/introspectionFromSchema.d.ts | 2 +- types/graphql/utilities/schemaPrinter.d.ts | 8 +++++ .../graphql/validation/ValidationContext.d.ts | 23 +++++++++--- types/graphql/validation/index.d.ts | 3 +- .../rules/ExecutableDefinitions.d.ts | 4 +-- .../validation/rules/FieldsOnCorrectType.d.ts | 2 +- .../rules/FragmentsOnCompositeTypes.d.ts | 2 +- .../validation/rules/KnownArgumentNames.d.ts | 5 ++- .../validation/rules/KnownDirectives.d.ts | 4 +-- .../validation/rules/KnownFragmentNames.d.ts | 2 +- .../validation/rules/KnownTypeNames.d.ts | 2 +- .../rules/LoneAnonymousOperation.d.ts | 4 +-- .../rules/LoneSchemaDefinition.d.ts | 13 +++++++ .../validation/rules/NoFragmentCycles.d.ts | 2 +- .../rules/NoUndefinedVariables.d.ts | 2 +- .../validation/rules/NoUnusedFragments.d.ts | 2 +- .../validation/rules/NoUnusedVariables.d.ts | 2 +- .../rules/OverlappingFieldsCanBeMerged.d.ts | 2 +- .../rules/PossibleFragmentSpreads.d.ts | 2 +- .../rules/ProvidedRequiredArguments.d.ts | 5 ++- .../graphql/validation/rules/ScalarLeafs.d.ts | 2 +- .../rules/SingleFieldSubscriptions.d.ts | 4 +-- .../validation/rules/UniqueArgumentNames.d.ts | 4 +-- .../rules/UniqueDirectivesPerLocation.d.ts | 4 +-- .../validation/rules/UniqueFragmentNames.d.ts | 4 +-- .../rules/UniqueInputFieldNames.d.ts | 4 +-- .../rules/UniqueOperationNames.d.ts | 4 +-- .../validation/rules/UniqueVariableNames.d.ts | 4 +-- .../validation/rules/ValuesOfCorrectType.d.ts | 2 +- .../rules/VariablesAreInputTypes.d.ts | 2 +- .../rules/VariablesInAllowedPosition.d.ts | 2 +- types/graphql/validation/specifiedRules.d.ts | 9 +++-- types/graphql/validation/validate.d.ts | 21 +++++++++-- 51 files changed, 240 insertions(+), 78 deletions(-) create mode 100644 types/graphql/language/predicates.d.ts create mode 100644 types/graphql/validation/rules/LoneSchemaDefinition.d.ts diff --git a/types/graphql/error/GraphQLError.d.ts b/types/graphql/error/GraphQLError.d.ts index 9a649a5c99..2c7c69544b 100644 --- a/types/graphql/error/GraphQLError.d.ts +++ b/types/graphql/error/GraphQLError.d.ts @@ -59,7 +59,7 @@ export class GraphQLError extends Error { /** * The original error thrown from a field resolver during execution. */ - readonly originalError: Maybe; + readonly originalError: Maybe & { readonly extensions: any }; /** * Extension fields to add to the formatted error. diff --git a/types/graphql/execution/values.d.ts b/types/graphql/execution/values.d.ts index e3cb7eb4bc..94f462e8b6 100644 --- a/types/graphql/execution/values.d.ts +++ b/types/graphql/execution/values.d.ts @@ -1,5 +1,5 @@ import Maybe from "../tsutils/Maybe"; -import { GraphQLError } from "../error"; +import { GraphQLError } from "../error/GraphQLError"; import { GraphQLInputType, GraphQLField, GraphQLArgument } from "../type/definition"; import { GraphQLDirective } from "../type/directives"; import { GraphQLSchema } from "../type/schema"; diff --git a/types/graphql/graphql.d.ts b/types/graphql/graphql.d.ts index 0b3d52b2d7..60dac7ccb3 100644 --- a/types/graphql/graphql.d.ts +++ b/types/graphql/graphql.d.ts @@ -22,6 +22,11 @@ import { ExecutionResult, ExecutionResultDataDefault } from "./execution/execute * rootValue: * The value provided as the first argument to resolver functions on the top * level type (e.g. the query object type). + * contextValue: + * The context value is provided as an argument to resolver functions after + * field arguments. It is used to pass shared information useful at any point + * during executing this query, for example the currently logged in user and + * connections to databases or other services. * variableValues: * A mapping of variable name to runtime value to use for all variables * defined in the requestString. diff --git a/types/graphql/index.d.ts b/types/graphql/index.d.ts index 5a4e0d77d6..4adbf97ab3 100644 --- a/types/graphql/index.d.ts +++ b/types/graphql/index.d.ts @@ -1,4 +1,4 @@ -// Type definitions for graphql 0.13 +// Type definitions for graphql 14.0 // Project: https://www.npmjs.com/package/graphql // Definitions by: TonyYang // Caleb Meredith @@ -84,6 +84,8 @@ export { isWrappingType, isNullableType, isNamedType, + isRequiredArgument, + isRequiredInputField, isSpecifiedScalarType, isIntrospectionType, isSpecifiedDirective, @@ -149,6 +151,9 @@ export { GraphQLTypeResolver, GraphQLUnionTypeConfig, GraphQLDirectiveConfig, + GraphQLScalarSerializer, + GraphQLScalarValueParser, + GraphQLScalarLiteralParser, } from "./type"; // Parse and operate on GraphQL language source files. @@ -170,6 +175,16 @@ export { TokenKind, DirectiveLocation, BREAK, + // Predicates + isDefinitionNode, + isExecutableDefinitionNode, + isSelectionNode, + isValueNode, + isTypeNode, + isTypeSystemDefinitionNode, + isTypeDefinitionNode, + isTypeSystemExtensionNode, + isTypeExtensionNode, // type Lexer, ParseOptions, @@ -311,7 +326,8 @@ export { buildASTSchema, // Build a GraphQLSchema from a GraphQL schema language document. buildSchema, - // Get the description from a schema AST node. + // @deprecated: Get the description from a schema AST node and supports legacy + // syntax for specifying descriptions - will be removed in v16 getDescription, // Extends an existing GraphQLSchema from a parsed GraphQL Schema // language AST. diff --git a/types/graphql/language/ast.d.ts b/types/graphql/language/ast.d.ts index 0a23cb68ee..6a6ee1b3e2 100644 --- a/types/graphql/language/ast.d.ts +++ b/types/graphql/language/ast.d.ts @@ -211,6 +211,7 @@ export interface VariableDefinitionNode { readonly variable: VariableNode; readonly type: TypeNode; readonly defaultValue?: ValueNode; + readonly directives?: ReadonlyArray; } export interface VariableNode { diff --git a/types/graphql/language/directiveLocation.d.ts b/types/graphql/language/directiveLocation.d.ts index 16c42d7877..d73e9f0e5a 100644 --- a/types/graphql/language/directiveLocation.d.ts +++ b/types/graphql/language/directiveLocation.d.ts @@ -13,6 +13,7 @@ type _DirectiveLocation = { FRAGMENT_DEFINITION: "FRAGMENT_DEFINITION"; FRAGMENT_SPREAD: "FRAGMENT_SPREAD"; INLINE_FRAGMENT: "INLINE_FRAGMENT"; + VARIABLE_DEFINITION: "VARIABLE_DEFINITION"; // Type System Definitions SCHEMA: "SCHEMA"; diff --git a/types/graphql/language/index.d.ts b/types/graphql/language/index.d.ts index b603240d1c..508a8063cf 100644 --- a/types/graphql/language/index.d.ts +++ b/types/graphql/language/index.d.ts @@ -78,4 +78,16 @@ export { InputObjectTypeExtensionNode, } from "./ast"; +export { + isDefinitionNode, + isExecutableDefinitionNode, + isSelectionNode, + isValueNode, + isTypeNode, + isTypeSystemDefinitionNode, + isTypeDefinitionNode, + isTypeSystemExtensionNode, + isTypeExtensionNode, +} from "./predicates"; + export { DirectiveLocation, DirectiveLocationEnum } from "./directiveLocation"; diff --git a/types/graphql/language/kinds.d.ts b/types/graphql/language/kinds.d.ts index e22bde2521..54ad33bf57 100644 --- a/types/graphql/language/kinds.d.ts +++ b/types/graphql/language/kinds.d.ts @@ -12,7 +12,6 @@ type _Kind = { DOCUMENT: "Document"; OPERATION_DEFINITION: "OperationDefinition"; VARIABLE_DEFINITION: "VariableDefinition"; - VARIABLE: "Variable"; SELECTION_SET: "SelectionSet"; FIELD: "Field"; ARGUMENT: "Argument"; @@ -23,6 +22,7 @@ type _Kind = { FRAGMENT_DEFINITION: "FragmentDefinition"; // Values + VARIABLE: "Variable"; INT: "IntValue"; FLOAT: "FloatValue"; STRING: "StringValue"; diff --git a/types/graphql/language/parser.d.ts b/types/graphql/language/parser.d.ts index cc9b0fd75f..c8117ac955 100644 --- a/types/graphql/language/parser.d.ts +++ b/types/graphql/language/parser.d.ts @@ -50,6 +50,17 @@ export interface ParseOptions { * future. */ experimentalFragmentVariables?: boolean; + + /** + * EXPERIMENTAL: + * + * If enabled, the parser understands directives on variable definitions: + * + * query Foo($var: String = "abc" @variable_definition_directive) { + * ... + * } + */ + experimentalVariableDefinitionDirectives?: boolean; } /** diff --git a/types/graphql/language/predicates.d.ts b/types/graphql/language/predicates.d.ts new file mode 100644 index 0000000000..81d2e02c41 --- /dev/null +++ b/types/graphql/language/predicates.d.ts @@ -0,0 +1,19 @@ +import { ASTNode } from "./ast"; + +export function isDefinitionNode(node: ASTNode): boolean; + +export function isExecutableDefinitionNode(node: ASTNode): boolean; + +export function isSelectionNode(node: ASTNode): boolean; + +export function isValueNode(node: ASTNode): boolean; + +export function isTypeNode(node: ASTNode): boolean; + +export function isTypeSystemDefinitionNode(node: ASTNode): boolean; + +export function isTypeDefinitionNode(node: ASTNode): boolean; + +export function isTypeSystemExtensionNode(node: ASTNode): boolean; + +export function isTypeExtensionNode(node: ASTNode): boolean; diff --git a/types/graphql/type/definition.d.ts b/types/graphql/type/definition.d.ts index 52d7e7f935..238446fb4c 100644 --- a/types/graphql/type/definition.d.ts +++ b/types/graphql/type/definition.d.ts @@ -156,7 +156,7 @@ export function assertAbstractType(type: any): GraphQLAbstractType; */ export class GraphQLList { readonly ofType: T; - constructor(type: T); + constructor(ofType: T); toString(): string; toJSON(): string; inspect(): string; @@ -184,7 +184,7 @@ export class GraphQLList { */ export class GraphQLNonNull { readonly ofType: T; - constructor(type: T); + constructor(ofType: T); toString(): string; toJSON(): string; inspect(): string; @@ -260,32 +260,36 @@ export type Thunk = (() => T) | T; export class GraphQLScalarType { name: string; description: Maybe; + serialize: GraphQLScalarSerializer; + parseValue: GraphQLScalarValueParser; + parseLiteral: GraphQLScalarLiteralParser; astNode: Maybe; extensionASTNodes: Maybe>; constructor(config: GraphQLScalarTypeConfig); - // Serializes an internal value to include in a response. - serialize(value: any): any; - - // Parses an externally provided value to use as an input. - parseValue(value: any): any; - - // Parses an externally provided literal value to use as an input. - parseLiteral(valueNode: ValueNode, variables?: Maybe<{ [key: string]: any }>): any; - toString(): string; toJSON(): string; inspect(): string; } +export type GraphQLScalarSerializer = (value: any) => Maybe; +export type GraphQLScalarValueParser = (value: any) => Maybe; +export type GraphQLScalarLiteralParser = ( + valueNode: ValueNode, + variables: Maybe<{ [key: string]: any }> +) => Maybe; + export interface GraphQLScalarTypeConfig { name: string; description?: Maybe; + // Serializes an internal value to include in a response. + serialize: GraphQLScalarSerializer; + // Parses an externally provided value to use as an input. + parseValue?: GraphQLScalarValueParser; + // Parses an externally provided literal value to use as an input. + parseLiteral?: GraphQLScalarLiteralParser; astNode?: Maybe; extensionASTNodes?: Maybe>; - serialize(value: any): Maybe; - parseValue?(value: any): Maybe; - parseLiteral?(valueNode: ValueNode, variables: Maybe<{ [key: string]: any }>): Maybe; } /** @@ -430,6 +434,8 @@ export interface GraphQLArgument { astNode?: Maybe; } +export function isRequiredArgument(arg: GraphQLArgument): boolean; + export type GraphQLFieldMap = { [key: string]: GraphQLField; }; @@ -658,4 +664,6 @@ export interface GraphQLInputField { astNode?: Maybe; } +export function isRequiredInputField(field: GraphQLInputField): boolean; + export type GraphQLInputFieldMap = { [key: string]: GraphQLInputField }; diff --git a/types/graphql/type/index.d.ts b/types/graphql/type/index.d.ts index c498f648e4..039062aacf 100644 --- a/types/graphql/type/index.d.ts +++ b/types/graphql/type/index.d.ts @@ -25,6 +25,8 @@ export { isWrappingType, isNullableType, isNamedType, + isRequiredArgument, + isRequiredInputField, // Assertions assertType, assertScalarType, @@ -92,6 +94,9 @@ export { GraphQLScalarTypeConfig, GraphQLTypeResolver, GraphQLUnionTypeConfig, + GraphQLScalarSerializer, + GraphQLScalarValueParser, + GraphQLScalarLiteralParser, } from "./definition"; export { diff --git a/types/graphql/type/schema.d.ts b/types/graphql/type/schema.d.ts index 19a9acbe8d..7ccb390dbe 100644 --- a/types/graphql/type/schema.d.ts +++ b/types/graphql/type/schema.d.ts @@ -71,8 +71,7 @@ export interface GraphQLSchemaValidationOptions { * in this list valid, even if they do not adhere to the specification's * schema validation rules. * - * This option is provided to ease adoption and may be removed in a future - * major release. + * This option is provided to ease adoption and will be removed in v15. */ allowedLegacyNames?: Maybe>; } diff --git a/types/graphql/utilities/buildASTSchema.d.ts b/types/graphql/utilities/buildASTSchema.d.ts index 89535d722f..1390601f65 100644 --- a/types/graphql/utilities/buildASTSchema.d.ts +++ b/types/graphql/utilities/buildASTSchema.d.ts @@ -22,10 +22,18 @@ interface BuildSchemaOptions extends GraphQLSchemaValidationOptions { * Descriptions are defined as preceding string literals, however an older * experimental version of the SDL supported preceding comments as * descriptions. Set to true to enable this deprecated behavior. + * This option is provided to ease adoption and will be removed in v16. * * Default: false */ commentDescriptions?: boolean; + + /** + * Set to true to assume the SDL is valid. + * + * Default: false + */ + assumeValidSDL?: boolean; } /** @@ -44,7 +52,7 @@ interface BuildSchemaOptions extends GraphQLSchemaValidationOptions { * Provide true to use preceding comments as the description. * */ -export function buildASTSchema(ast: DocumentNode, options?: BuildSchemaOptions): GraphQLSchema; +export function buildASTSchema(documentAST: DocumentNode, options?: BuildSchemaOptions): GraphQLSchema; type TypeDefinitionsMap = { [key: string]: TypeDefinitionNode }; type TypeResolver = (typeRef: NamedTypeNode) => GraphQLNamedType; @@ -67,6 +75,7 @@ export class ASTDefinitionBuilder { /** * Given an ast node, returns its string description. + * @deprecated: provided to ease adoption and will be removed in v16. * * Accepts options as a second argument: * diff --git a/types/graphql/utilities/coerceValue.d.ts b/types/graphql/utilities/coerceValue.d.ts index 081eea4a32..d1fb9eceee 100644 --- a/types/graphql/utilities/coerceValue.d.ts +++ b/types/graphql/utilities/coerceValue.d.ts @@ -1,4 +1,4 @@ -import { GraphQLError } from "../error"; +import { GraphQLError } from "../error/GraphQLError"; import { ASTNode } from "../language/ast"; import { GraphQLInputType } from "../type/definition"; diff --git a/types/graphql/utilities/extendSchema.d.ts b/types/graphql/utilities/extendSchema.d.ts index 7cde767ed7..094a10310d 100644 --- a/types/graphql/utilities/extendSchema.d.ts +++ b/types/graphql/utilities/extendSchema.d.ts @@ -7,10 +7,18 @@ interface Options extends GraphQLSchemaValidationOptions { * Descriptions are defined as preceding string literals, however an older * experimental version of the SDL supported preceding comments as * descriptions. Set to true to enable this deprecated behavior. + * This option is provided to ease adoption and will be removed in v16. * * Default: false */ commentDescriptions?: boolean; + + /** + * Set to true to assume the SDL is valid. + * + * Default: false + */ + assumeValidSDL?: boolean; } /** diff --git a/types/graphql/utilities/findBreakingChanges.d.ts b/types/graphql/utilities/findBreakingChanges.d.ts index 84f1bea158..4b8111d3a5 100644 --- a/types/graphql/utilities/findBreakingChanges.d.ts +++ b/types/graphql/utilities/findBreakingChanges.d.ts @@ -12,7 +12,7 @@ import { GraphQLDirective } from "../type/directives"; import { GraphQLSchema } from "../type/schema"; import { DirectiveLocationEnum } from "../language/directiveLocation"; -export const BreakingChangeType : _BreakingChangeType; +export const BreakingChangeType: _BreakingChangeType; // @internal type _BreakingChangeType = { @@ -24,13 +24,13 @@ type _BreakingChangeType = { VALUE_REMOVED_FROM_ENUM: "VALUE_REMOVED_FROM_ENUM"; ARG_REMOVED: "ARG_REMOVED"; ARG_CHANGED_KIND: "ARG_CHANGED_KIND"; - NON_NULL_ARG_ADDED: "NON_NULL_ARG_ADDED"; - NON_NULL_INPUT_FIELD_ADDED: "NON_NULL_INPUT_FIELD_ADDED"; + REQUIRED_ARG_ADDED: "REQUIRED_ARG_ADDED"; + REQUIRED_INPUT_FIELD_ADDED: "REQUIRED_INPUT_FIELD_ADDED"; INTERFACE_REMOVED_FROM_OBJECT: "INTERFACE_REMOVED_FROM_OBJECT"; DIRECTIVE_REMOVED: "DIRECTIVE_REMOVED"; DIRECTIVE_ARG_REMOVED: "DIRECTIVE_ARG_REMOVED"; DIRECTIVE_LOCATION_REMOVED: "DIRECTIVE_LOCATION_REMOVED"; - NON_NULL_DIRECTIVE_ARG_ADDED: "NON_NULL_DIRECTIVE_ARG_ADDED"; + REQUIRED_DIRECTIVE_ARG_ADDED: "REQUIRED_DIRECTIVE_ARG_ADDED"; }; export const DangerousChangeType: _DangerousChangeType; @@ -41,8 +41,8 @@ type _DangerousChangeType = { VALUE_ADDED_TO_ENUM: "VALUE_ADDED_TO_ENUM"; INTERFACE_ADDED_TO_OBJECT: "INTERFACE_ADDED_TO_OBJECT"; TYPE_ADDED_TO_UNION: "TYPE_ADDED_TO_UNION"; - NULLABLE_INPUT_FIELD_ADDED: "NULLABLE_INPUT_FIELD_ADDED"; - NULLABLE_ARG_ADDED: "NULLABLE_ARG_ADDED"; + OPTIONAL_INPUT_FIELD_ADDED: "OPTIONAL_INPUT_FIELD_ADDED"; + OPTIONAL_ARG_ADDED: "OPTIONAL_ARG_ADDED"; }; export interface BreakingChange { diff --git a/types/graphql/utilities/index.d.ts b/types/graphql/utilities/index.d.ts index e2794bdc98..29e90b1fee 100644 --- a/types/graphql/utilities/index.d.ts +++ b/types/graphql/utilities/index.d.ts @@ -43,7 +43,14 @@ export { introspectionFromSchema } from "./introspectionFromSchema"; export { buildClientSchema } from "./buildClientSchema"; // Build a GraphQLSchema from GraphQL Schema language. -export { buildASTSchema, buildSchema, getDescription, BuildSchemaOptions } from "./buildASTSchema"; +export { + buildASTSchema, + buildSchema, + // @deprecated: Get the description from a schema AST node and supports legacy + // syntax for specifying descriptions - will be removed in v16 + getDescription, + BuildSchemaOptions, +} from "./buildASTSchema"; // Extends an existing GraphQLSchema from a parsed GraphQL Schema language AST. export { extendSchema } from "./extendSchema"; diff --git a/types/graphql/utilities/introspectionFromSchema.d.ts b/types/graphql/utilities/introspectionFromSchema.d.ts index 8733a35087..8b2df44439 100644 --- a/types/graphql/utilities/introspectionFromSchema.d.ts +++ b/types/graphql/utilities/introspectionFromSchema.d.ts @@ -10,4 +10,4 @@ import { IntrospectionQuery, IntrospectionOptions } from "./introspectionQuery"; * This is the inverse of buildClientSchema. The primary use case is outside * of the server context, for instance when doing schema comparisons. */ -export function introspectionFromSchema(schema: GraphQLSchema, options: IntrospectionOptions): IntrospectionQuery; +export function introspectionFromSchema(schema: GraphQLSchema, options?: IntrospectionOptions): IntrospectionQuery; diff --git a/types/graphql/utilities/schemaPrinter.d.ts b/types/graphql/utilities/schemaPrinter.d.ts index 8e3aefe7fc..154d287cc9 100644 --- a/types/graphql/utilities/schemaPrinter.d.ts +++ b/types/graphql/utilities/schemaPrinter.d.ts @@ -2,6 +2,14 @@ import { GraphQLSchema } from "../type/schema"; import { GraphQLType, GraphQLNamedType } from "../type/definition"; export interface Options { + /** + * Descriptions are defined as preceding string literals, however an older + * experimental version of the SDL supported preceding comments as + * descriptions. Set to true to enable this deprecated behavior. + * This option is provided to ease adoption and will be removed in v16. + * + * Default: false + */ commentDescriptions?: boolean; } diff --git a/types/graphql/validation/ValidationContext.d.ts b/types/graphql/validation/ValidationContext.d.ts index 24049decdf..0da635756a 100644 --- a/types/graphql/validation/ValidationContext.d.ts +++ b/types/graphql/validation/ValidationContext.d.ts @@ -18,6 +18,7 @@ import { } from "../type/definition"; import { GraphQLDirective } from "../type/directives"; import { TypeInfo } from "../utilities/TypeInfo"; +import { ASTVisitor } from "../language/visitor"; type NodeWithSelectionSet = OperationDefinitionNode | FragmentDefinitionNode; type VariableUsage = { @@ -31,16 +32,28 @@ type VariableUsage = { * allowing access to commonly useful contextual information from within a * validation rule. */ -export default class ValidationContext { - constructor(schema: GraphQLSchema, ast: DocumentNode, typeInfo: TypeInfo); +export class ASTValidationContext { + constructor(ast: DocumentNode); reportError(error: GraphQLError): undefined; getErrors(): ReadonlyArray; - getSchema(): GraphQLSchema; - getDocument(): DocumentNode; +} + +export class SDLValidationContext extends ASTValidationContext { + constructor(ast: DocumentNode, schema?: Maybe); + + getSchema(): Maybe; +} + +export type SDLValidationRule = (context: SDLValidationContext) => ASTVisitor; + +export class ValidationContext extends ASTValidationContext { + constructor(schema: GraphQLSchema, ast: DocumentNode, typeInfo: TypeInfo); + + getSchema(): GraphQLSchema; getFragment(name: string): Maybe; @@ -66,3 +79,5 @@ export default class ValidationContext { getArgument(): Maybe; } + +export type ValidationRule = (context: ValidationContext) => ASTVisitor; diff --git a/types/graphql/validation/index.d.ts b/types/graphql/validation/index.d.ts index c321f258dd..3046930152 100644 --- a/types/graphql/validation/index.d.ts +++ b/types/graphql/validation/index.d.ts @@ -1,7 +1,6 @@ export { validate } from "./validate"; -import ValidationContext from "./ValidationContext"; -export { ValidationContext }; +export { ValidationContext } from "./ValidationContext"; export { specifiedRules } from "./specifiedRules"; diff --git a/types/graphql/validation/rules/ExecutableDefinitions.d.ts b/types/graphql/validation/rules/ExecutableDefinitions.d.ts index 423e0dcad2..405e140530 100644 --- a/types/graphql/validation/rules/ExecutableDefinitions.d.ts +++ b/types/graphql/validation/rules/ExecutableDefinitions.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function nonExecutableDefinitionMessage(defName: string): string; @@ -9,4 +9,4 @@ export function nonExecutableDefinitionMessage(defName: string): string; * A GraphQL document is only valid for execution if all definitions are either * operation or fragment definitions. */ -export function ExecutableDefinitions(context: ValidationContext): ASTVisitor; +export function ExecutableDefinitions(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/FieldsOnCorrectType.d.ts b/types/graphql/validation/rules/FieldsOnCorrectType.d.ts index c5c7f053c2..a2dd533502 100644 --- a/types/graphql/validation/rules/FieldsOnCorrectType.d.ts +++ b/types/graphql/validation/rules/FieldsOnCorrectType.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; /** diff --git a/types/graphql/validation/rules/FragmentsOnCompositeTypes.d.ts b/types/graphql/validation/rules/FragmentsOnCompositeTypes.d.ts index 9c6595b51a..d45212c58b 100644 --- a/types/graphql/validation/rules/FragmentsOnCompositeTypes.d.ts +++ b/types/graphql/validation/rules/FragmentsOnCompositeTypes.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function inlineFragmentOnNonCompositeErrorMessage(type: string): string; diff --git a/types/graphql/validation/rules/KnownArgumentNames.d.ts b/types/graphql/validation/rules/KnownArgumentNames.d.ts index 9602c34c43..25bd10ebed 100644 --- a/types/graphql/validation/rules/KnownArgumentNames.d.ts +++ b/types/graphql/validation/rules/KnownArgumentNames.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext, SDLValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function unknownArgMessage( @@ -21,3 +21,6 @@ export function unknownDirectiveArgMessage( * that field. */ export function KnownArgumentNames(context: ValidationContext): ASTVisitor; + +// @internal +export function KnownArgumentNamesOnDirectives(context: ValidationContext | SDLValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/KnownDirectives.d.ts b/types/graphql/validation/rules/KnownDirectives.d.ts index 179e65b9f7..35859f9c2d 100644 --- a/types/graphql/validation/rules/KnownDirectives.d.ts +++ b/types/graphql/validation/rules/KnownDirectives.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext, SDLValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function unknownDirectiveMessage(directiveName: string): string; @@ -11,4 +11,4 @@ export function misplacedDirectiveMessage(directiveName: string, location: strin * A GraphQL document is only valid if all `@directives` are known by the * schema and legally positioned. */ -export function KnownDirectives(context: ValidationContext): ASTVisitor; +export function KnownDirectives(context: ValidationContext | SDLValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/KnownFragmentNames.d.ts b/types/graphql/validation/rules/KnownFragmentNames.d.ts index 40405f67dd..5709ef3e63 100644 --- a/types/graphql/validation/rules/KnownFragmentNames.d.ts +++ b/types/graphql/validation/rules/KnownFragmentNames.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function unknownFragmentMessage(fragName: string): string; diff --git a/types/graphql/validation/rules/KnownTypeNames.d.ts b/types/graphql/validation/rules/KnownTypeNames.d.ts index 6bef3661f9..1fe8885dab 100644 --- a/types/graphql/validation/rules/KnownTypeNames.d.ts +++ b/types/graphql/validation/rules/KnownTypeNames.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function unknownTypeMessage(typeName: string, suggestedTypes: Array): string; diff --git a/types/graphql/validation/rules/LoneAnonymousOperation.d.ts b/types/graphql/validation/rules/LoneAnonymousOperation.d.ts index 881814c4d2..4fa878774c 100644 --- a/types/graphql/validation/rules/LoneAnonymousOperation.d.ts +++ b/types/graphql/validation/rules/LoneAnonymousOperation.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function anonOperationNotAloneMessage(): string; @@ -9,4 +9,4 @@ export function anonOperationNotAloneMessage(): string; * 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. */ -export function LoneAnonymousOperation(context: ValidationContext): ASTVisitor; +export function LoneAnonymousOperation(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/LoneSchemaDefinition.d.ts b/types/graphql/validation/rules/LoneSchemaDefinition.d.ts new file mode 100644 index 0000000000..66b1844c54 --- /dev/null +++ b/types/graphql/validation/rules/LoneSchemaDefinition.d.ts @@ -0,0 +1,13 @@ +import { SDLValidationContext } from "../ValidationContext"; +import { ASTVisitor } from "../../language/visitor"; + +export function schemaDefinitionNotAloneMessage(): string; + +export function canNotDefineSchemaWithinExtensionMessage(): string; + +/** + * Lone Schema definition + * + * A GraphQL document is only valid if it contains only one schema definition. + */ +export function LoneSchemaDefinition(context: SDLValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/NoFragmentCycles.d.ts b/types/graphql/validation/rules/NoFragmentCycles.d.ts index f119c5a487..bd9e9b1c1a 100644 --- a/types/graphql/validation/rules/NoFragmentCycles.d.ts +++ b/types/graphql/validation/rules/NoFragmentCycles.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function cycleErrorMessage(fragName: string, spreadNames: Array): string; diff --git a/types/graphql/validation/rules/NoUndefinedVariables.d.ts b/types/graphql/validation/rules/NoUndefinedVariables.d.ts index f340b41ad8..415382149e 100644 --- a/types/graphql/validation/rules/NoUndefinedVariables.d.ts +++ b/types/graphql/validation/rules/NoUndefinedVariables.d.ts @@ -1,5 +1,5 @@ import Maybe from "../../tsutils/Maybe"; -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function undefinedVarMessage(varName: string, opName: Maybe): string; diff --git a/types/graphql/validation/rules/NoUnusedFragments.d.ts b/types/graphql/validation/rules/NoUnusedFragments.d.ts index 6f757c16c2..91978e7875 100644 --- a/types/graphql/validation/rules/NoUnusedFragments.d.ts +++ b/types/graphql/validation/rules/NoUnusedFragments.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function unusedFragMessage(fragName: string): string; diff --git a/types/graphql/validation/rules/NoUnusedVariables.d.ts b/types/graphql/validation/rules/NoUnusedVariables.d.ts index 1846995a1f..f0052f7940 100644 --- a/types/graphql/validation/rules/NoUnusedVariables.d.ts +++ b/types/graphql/validation/rules/NoUnusedVariables.d.ts @@ -1,5 +1,5 @@ import Maybe from "../../tsutils/Maybe"; -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function unusedVariableMessage(varName: string, opName: Maybe): string; diff --git a/types/graphql/validation/rules/OverlappingFieldsCanBeMerged.d.ts b/types/graphql/validation/rules/OverlappingFieldsCanBeMerged.d.ts index 1dfa62a089..dc9993e3f0 100644 --- a/types/graphql/validation/rules/OverlappingFieldsCanBeMerged.d.ts +++ b/types/graphql/validation/rules/OverlappingFieldsCanBeMerged.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function fieldsConflictMessage(responseName: string, reason: ConflictReasonMessage): string; diff --git a/types/graphql/validation/rules/PossibleFragmentSpreads.d.ts b/types/graphql/validation/rules/PossibleFragmentSpreads.d.ts index 53216d0248..cd83879798 100644 --- a/types/graphql/validation/rules/PossibleFragmentSpreads.d.ts +++ b/types/graphql/validation/rules/PossibleFragmentSpreads.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function typeIncompatibleSpreadMessage(fragName: string, parentType: string, fragType: string): string; diff --git a/types/graphql/validation/rules/ProvidedRequiredArguments.d.ts b/types/graphql/validation/rules/ProvidedRequiredArguments.d.ts index e578815b25..000095510f 100644 --- a/types/graphql/validation/rules/ProvidedRequiredArguments.d.ts +++ b/types/graphql/validation/rules/ProvidedRequiredArguments.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext, SDLValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function missingFieldArgMessage(fieldName: string, argName: string, type: string): string; @@ -12,3 +12,6 @@ export function missingDirectiveArgMessage(directiveName: string, argName: strin * default value) field arguments have been provided. */ export function ProvidedRequiredArguments(context: ValidationContext): ASTVisitor; + +// @internal +export function ProvidedRequiredArgumentsOnDirectives(context: ValidationContext | SDLValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/ScalarLeafs.d.ts b/types/graphql/validation/rules/ScalarLeafs.d.ts index 558cd91cee..c6f73ec047 100644 --- a/types/graphql/validation/rules/ScalarLeafs.d.ts +++ b/types/graphql/validation/rules/ScalarLeafs.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function noSubselectionAllowedMessage(fieldName: string, type: string): string; diff --git a/types/graphql/validation/rules/SingleFieldSubscriptions.d.ts b/types/graphql/validation/rules/SingleFieldSubscriptions.d.ts index 54b1fec36a..1e473032ce 100644 --- a/types/graphql/validation/rules/SingleFieldSubscriptions.d.ts +++ b/types/graphql/validation/rules/SingleFieldSubscriptions.d.ts @@ -1,5 +1,5 @@ import Maybe from "../../tsutils/Maybe"; -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function singleFieldOnlyMessage(name: Maybe): string; @@ -9,4 +9,4 @@ export function singleFieldOnlyMessage(name: Maybe): string; * * A GraphQL subscription is valid only if it contains a single root field. */ -export function SingleFieldSubscriptions(context: ValidationContext): ASTVisitor; +export function SingleFieldSubscriptions(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/UniqueArgumentNames.d.ts b/types/graphql/validation/rules/UniqueArgumentNames.d.ts index 47a59c3362..3c6b0d5f02 100644 --- a/types/graphql/validation/rules/UniqueArgumentNames.d.ts +++ b/types/graphql/validation/rules/UniqueArgumentNames.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function duplicateArgMessage(argName: string): string; @@ -9,4 +9,4 @@ export function duplicateArgMessage(argName: string): string; * A GraphQL field or directive is only valid if all supplied arguments are * uniquely named. */ -export function UniqueArgumentNames(context: ValidationContext): ASTVisitor; +export function UniqueArgumentNames(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/UniqueDirectivesPerLocation.d.ts b/types/graphql/validation/rules/UniqueDirectivesPerLocation.d.ts index f3d6327c23..6a3b9e16b6 100644 --- a/types/graphql/validation/rules/UniqueDirectivesPerLocation.d.ts +++ b/types/graphql/validation/rules/UniqueDirectivesPerLocation.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function duplicateDirectiveMessage(directiveName: string): string; @@ -9,4 +9,4 @@ export function duplicateDirectiveMessage(directiveName: string): string; * A GraphQL document is only valid if all directives at a given location * are uniquely named. */ -export function UniqueDirectivesPerLocation(context: ValidationContext): ASTVisitor; +export function UniqueDirectivesPerLocation(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/UniqueFragmentNames.d.ts b/types/graphql/validation/rules/UniqueFragmentNames.d.ts index 9a2554200c..08504fec6d 100644 --- a/types/graphql/validation/rules/UniqueFragmentNames.d.ts +++ b/types/graphql/validation/rules/UniqueFragmentNames.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function duplicateFragmentNameMessage(fragName: string): string; @@ -8,4 +8,4 @@ export function duplicateFragmentNameMessage(fragName: string): string; * * A GraphQL document is only valid if all defined fragments have unique names. */ -export function UniqueFragmentNames(context: ValidationContext): ASTVisitor; +export function UniqueFragmentNames(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/UniqueInputFieldNames.d.ts b/types/graphql/validation/rules/UniqueInputFieldNames.d.ts index 34d5b9845a..d59fdaee1b 100644 --- a/types/graphql/validation/rules/UniqueInputFieldNames.d.ts +++ b/types/graphql/validation/rules/UniqueInputFieldNames.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function duplicateInputFieldMessage(fieldName: string): string; @@ -9,4 +9,4 @@ export function duplicateInputFieldMessage(fieldName: string): string; * A GraphQL input object value is only valid if all supplied fields are * uniquely named. */ -export function UniqueInputFieldNames(context: ValidationContext): ASTVisitor; +export function UniqueInputFieldNames(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/UniqueOperationNames.d.ts b/types/graphql/validation/rules/UniqueOperationNames.d.ts index 221b1187c2..8cc4dc03ba 100644 --- a/types/graphql/validation/rules/UniqueOperationNames.d.ts +++ b/types/graphql/validation/rules/UniqueOperationNames.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function duplicateOperationNameMessage(operationName: string): string; @@ -8,4 +8,4 @@ export function duplicateOperationNameMessage(operationName: string): string; * * A GraphQL document is only valid if all defined operations have unique names. */ -export function UniqueOperationNames(context: ValidationContext): ASTVisitor; +export function UniqueOperationNames(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/UniqueVariableNames.d.ts b/types/graphql/validation/rules/UniqueVariableNames.d.ts index d0aaf0404e..0f9439b5af 100644 --- a/types/graphql/validation/rules/UniqueVariableNames.d.ts +++ b/types/graphql/validation/rules/UniqueVariableNames.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ASTValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function duplicateVariableMessage(variableName: string): string; @@ -8,4 +8,4 @@ export function duplicateVariableMessage(variableName: string): string; * * A GraphQL operation is only valid if all its variables are uniquely named. */ -export function UniqueVariableNames(context: ValidationContext): ASTVisitor; +export function UniqueVariableNames(context: ASTValidationContext): ASTVisitor; diff --git a/types/graphql/validation/rules/ValuesOfCorrectType.d.ts b/types/graphql/validation/rules/ValuesOfCorrectType.d.ts index 09314835ad..9896207d33 100644 --- a/types/graphql/validation/rules/ValuesOfCorrectType.d.ts +++ b/types/graphql/validation/rules/ValuesOfCorrectType.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function badValueMessage(typeName: string, valueName: string, message?: string): string; diff --git a/types/graphql/validation/rules/VariablesAreInputTypes.d.ts b/types/graphql/validation/rules/VariablesAreInputTypes.d.ts index 32472e15fd..712e645092 100644 --- a/types/graphql/validation/rules/VariablesAreInputTypes.d.ts +++ b/types/graphql/validation/rules/VariablesAreInputTypes.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function nonInputTypeOnVarMessage(variableName: string, typeName: string): string; diff --git a/types/graphql/validation/rules/VariablesInAllowedPosition.d.ts b/types/graphql/validation/rules/VariablesInAllowedPosition.d.ts index 891d344714..2e994a3438 100644 --- a/types/graphql/validation/rules/VariablesInAllowedPosition.d.ts +++ b/types/graphql/validation/rules/VariablesInAllowedPosition.d.ts @@ -1,4 +1,4 @@ -import ValidationContext from "../ValidationContext"; +import { ValidationContext } from "../ValidationContext"; import { ASTVisitor } from "../../language/visitor"; export function badVarPosMessage(varName: string, varType: string, expectedType: string): string; diff --git a/types/graphql/validation/specifiedRules.d.ts b/types/graphql/validation/specifiedRules.d.ts index 85522503df..f6ff475674 100644 --- a/types/graphql/validation/specifiedRules.d.ts +++ b/types/graphql/validation/specifiedRules.d.ts @@ -1,3 +1,5 @@ +import { ValidationRule, SDLValidationRule } from "./ValidationContext"; + // Spec Section: "Executable Definitions" import { ExecutableDefinitions } from "./rules/ExecutableDefinitions"; @@ -76,12 +78,13 @@ import { OverlappingFieldsCanBeMerged } from "./rules/OverlappingFieldsCanBeMerg // Spec Section: "Input Object Field Uniqueness" import { UniqueInputFieldNames } from "./rules/UniqueInputFieldNames"; -import ValidationContext from "./ValidationContext"; - /** * This set includes all validation rules defined by the GraphQL spec. * * The order of the rules in this list has been adjusted to lead to the * most clear output when encountering multiple validation errors. */ -export const specifiedRules: Array<(context: ValidationContext) => any>; +export const specifiedRules: ReadonlyArray; + +// @internal +export const specifiedSDLRules: ReadonlyArray; diff --git a/types/graphql/validation/validate.d.ts b/types/graphql/validation/validate.d.ts index 9a5092d258..6c0e644ea3 100644 --- a/types/graphql/validation/validate.d.ts +++ b/types/graphql/validation/validate.d.ts @@ -2,6 +2,7 @@ import { GraphQLError } from "../error"; import { DocumentNode } from "../language/ast"; import { GraphQLSchema } from "../type/schema"; import { TypeInfo } from "../utilities/TypeInfo"; +import { ValidationRule } from "./ValidationContext"; /** * Implements the "Validation" section of the spec. @@ -21,7 +22,23 @@ import { TypeInfo } from "../utilities/TypeInfo"; */ export function validate( schema: GraphQLSchema, - ast: DocumentNode, - rules?: ReadonlyArray, + documentAST: DocumentNode, + rules?: ReadonlyArray, typeInfo?: TypeInfo ): ReadonlyArray; + +/** + * Utility function which asserts a SDL document is valid by throwing an error + * if it is invalid. + * + * @internal + */ +export function assertValidSDL(documentAST: DocumentNode): undefined; + +/** + * Utility function which asserts a SDL document is valid by throwing an error + * if it is invalid. + * + * @internal + */ +export function assertValidSDLExtension(documentAST: DocumentNode, schema: GraphQLSchema): undefined;