Skip to content

Split out 'ASTValidationContext' #1446

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

Merged
merged 1 commit into from
Aug 3, 2018
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/utilities/isValidLiteralValue.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { visit, visitWithTypeInfo } from '../language/visitor';
import type { GraphQLInputType } from '../type/definition';
import { GraphQLSchema } from '../type/schema';
import { ValuesOfCorrectType } from '../validation/rules/ValuesOfCorrectType';
import ValidationContext from '../validation/ValidationContext';
import { ValidationContext } from '../validation/ValidationContext';

/**
* Utility which determines if a value literal node is valid for an input type.
Expand Down
41 changes: 24 additions & 17 deletions src/validation/ValidationContext.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,31 @@ type VariableUsage = {|
* allowing access to commonly useful contextual information from within a
* validation rule.
*/
export default class ValidationContext {
_schema: GraphQLSchema;
export class ASTValidationContext {
_ast: DocumentNode;
_typeInfo: TypeInfo;
_errors: Array<GraphQLError>;

constructor(ast: DocumentNode): void {
this._ast = ast;
this._errors = [];
}

reportError(error: GraphQLError): void {
this._errors.push(error);
}

getErrors(): $ReadOnlyArray<GraphQLError> {
return this._errors;
}

getDocument(): DocumentNode {
return this._ast;
}
}

export class ValidationContext extends ASTValidationContext {
_schema: GraphQLSchema;
_typeInfo: TypeInfo;
_fragments: ObjMap<FragmentDefinitionNode>;
_fragmentSpreads: Map<SelectionSetNode, $ReadOnlyArray<FragmentSpreadNode>>;
_recursivelyReferencedFragments: Map<
Expand All @@ -64,32 +84,19 @@ export default class ValidationContext {
ast: DocumentNode,
typeInfo: TypeInfo,
): void {
super(ast);
this._schema = schema;
this._ast = ast;
this._typeInfo = typeInfo;
this._errors = [];
this._fragmentSpreads = new Map();
this._recursivelyReferencedFragments = new Map();
this._variableUsages = new Map();
this._recursiveVariableUsages = new Map();
}

reportError(error: GraphQLError): void {
this._errors.push(error);
}

getErrors(): $ReadOnlyArray<GraphQLError> {
return this._errors;
}

getSchema(): GraphQLSchema {
return this._schema;
}

getDocument(): DocumentNode {
return this._ast;
}

getFragment(name: string): ?FragmentDefinitionNode {
let fragments = this._fragments;
if (!fragments) {
Expand Down
4 changes: 1 addition & 3 deletions src/validation/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@

export { validate } from './validate';

// https://github.com/tc39/proposal-export-default-from
import ValidationContext from './ValidationContext';
export { ValidationContext };
export { ValidationContext } from './ValidationContext';

export { specifiedRules } from './specifiedRules';

Expand Down
6 changes: 4 additions & 2 deletions src/validation/rules/ExecutableDefinitions.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import { Kind } from '../../language/kinds';
import type { ASTVisitor } from '../../language/visitor';
Expand All @@ -22,7 +22,9 @@ 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 {
return {
Document(node) {
for (const definition of node.definitions) {
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/FieldsOnCorrectType.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import suggestionList from '../../jsutils/suggestionList';
import quotedOrList from '../../jsutils/quotedOrList';
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/FragmentsOnCompositeTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import { print } from '../../language/printer';
import type { ASTVisitor } from '../../language/visitor';
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/KnownArgumentNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';
import suggestionList from '../../jsutils/suggestionList';
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/KnownDirectives.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import find from '../../jsutils/find';
import { Kind } from '../../language/kinds';
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/KnownFragmentNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';

Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/KnownTypeNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import suggestionList from '../../jsutils/suggestionList';
import quotedOrList from '../../jsutils/quotedOrList';
Expand Down
6 changes: 4 additions & 2 deletions src/validation/rules/LoneAnonymousOperation.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import { Kind } from '../../language/kinds';
import type { ASTVisitor } from '../../language/visitor';
Expand All @@ -22,7 +22,9 @@ 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 {
let operationCount = 0;
return {
Document(node) {
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/NoFragmentCycles.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { FragmentDefinitionNode } from '../../language/ast';
import type { ASTVisitor } from '../../language/visitor';
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/NoUndefinedVariables.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';

Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/NoUnusedFragments.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';

Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/NoUnusedVariables.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';

Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/OverlappingFieldsCanBeMerged.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import inspect from '../../jsutils/inspect';
import find from '../../jsutils/find';
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/PossibleFragmentSpreads.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*/

import inspect from '../../jsutils/inspect';
import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';
import { doTypesOverlap } from '../../utilities/typeComparators';
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/ProvidedRequiredArguments.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import inspect from '../../jsutils/inspect';
import keyMap from '../../jsutils/keyMap';
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/ScalarLeafs.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*/

import inspect from '../../jsutils/inspect';
import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { FieldNode } from '../../language/ast';
import { getNamedType, isLeafType } from '../../type/definition';
Expand Down
4 changes: 2 additions & 2 deletions src/validation/rules/SingleFieldSubscriptions.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { OperationDefinitionNode } from '../../language/ast';
import type { ASTVisitor } from '../../language/visitor';
Expand All @@ -25,7 +25,7 @@ export function singleFieldOnlyMessage(name: ?string): string {
* A GraphQL subscription is valid only if it contains a single root field.
*/
export function SingleFieldSubscriptions(
context: ValidationContext,
context: ASTValidationContext,
): ASTVisitor {
return {
OperationDefinition(node: OperationDefinitionNode) {
Expand Down
4 changes: 2 additions & 2 deletions src/validation/rules/UniqueArgumentNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';

Expand All @@ -21,7 +21,7 @@ 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 {
let knownArgNames = Object.create(null);
return {
Field() {
Expand Down
4 changes: 2 additions & 2 deletions src/validation/rules/UniqueDirectivesPerLocation.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { DirectiveNode } from '../../language/ast';
import type { ASTVisitor } from '../../language/visitor';
Expand All @@ -26,7 +26,7 @@ export function duplicateDirectiveMessage(directiveName: string): string {
* are uniquely named.
*/
export function UniqueDirectivesPerLocation(
context: ValidationContext,
context: ASTValidationContext,
): ASTVisitor {
return {
// Many different AST nodes may contain directives. Rather than listing
Expand Down
4 changes: 2 additions & 2 deletions src/validation/rules/UniqueFragmentNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';

Expand All @@ -20,7 +20,7 @@ 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 {
const knownFragmentNames = Object.create(null);
return {
OperationDefinition: () => false,
Expand Down
6 changes: 4 additions & 2 deletions src/validation/rules/UniqueInputFieldNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';

Expand All @@ -21,7 +21,9 @@ 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 {
const knownNameStack = [];
let knownNames = Object.create(null);

Expand Down
6 changes: 4 additions & 2 deletions src/validation/rules/UniqueOperationNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';

Expand All @@ -20,7 +20,9 @@ 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 {
const knownOperationNames = Object.create(null);
return {
OperationDefinition(node) {
Expand Down
4 changes: 2 additions & 2 deletions src/validation/rules/UniqueVariableNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ASTValidationContext } from '../ValidationContext';
import type { VariableDefinitionNode } from '../../language/ast';
import { GraphQLError } from '../../error';
import type { ASTVisitor } from '../../language/visitor';
Expand All @@ -21,7 +21,7 @@ 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 {
let knownVariableNames = Object.create(null);
return {
OperationDefinition() {
Expand Down
2 changes: 1 addition & 1 deletion src/validation/rules/ValuesOfCorrectType.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow strict
*/

import type ValidationContext from '../ValidationContext';
import type { ValidationContext } from '../ValidationContext';
import { GraphQLError } from '../../error';
import type { ValueNode } from '../../language/ast';
import { print } from '../../language/printer';
Expand Down
Loading