diff --git a/src/index.d.ts b/src/index.d.ts index a677014b3c..7b3964b050 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -229,7 +229,6 @@ export { ASTVisitor, Visitor, VisitFn, - VisitorKeyMap, // AST nodes ASTNode, ASTKindToNode, diff --git a/src/index.js b/src/index.js index 873a374ba2..01b9576235 100644 --- a/src/index.js +++ b/src/index.js @@ -216,7 +216,6 @@ export type { ASTVisitor, Visitor, VisitFn, - VisitorKeyMap, // AST nodes ASTNode, ASTKindToNode, diff --git a/src/language/__tests__/visitor-test.js b/src/language/__tests__/visitor-test.js index a0e732e57e..15a12a6253 100644 --- a/src/language/__tests__/visitor-test.js +++ b/src/language/__tests__/visitor-test.js @@ -8,7 +8,7 @@ import { invariant } from '../../jsutils/invariant'; import type { ASTNode } from '../ast'; import { Kind } from '../kinds'; import { parse } from '../parser'; -import { visit, visitInParallel, BREAK, QueryDocumentKeys } from '../visitor'; +import { visit, visitInParallel, BREAK } from '../visitor'; function checkVisitorFnArgs(ast: any, args: any, isEdited: boolean = false) { const [node, key, parent, path, ancestors] = args; @@ -913,45 +913,6 @@ describe('Visitor', () => { ['leave', 'Document', undefined], ]); }); - - it('does traverse unknown node kinds with visitor keys', () => { - const customQueryDocumentKeys = { ...QueryDocumentKeys }; - (customQueryDocumentKeys: any).CustomField = ['name', 'selectionSet']; - - const visited = []; - const visitor = { - enter(node) { - visited.push(['enter', node.kind, getValue(node)]); - }, - leave(node) { - visited.push(['leave', node.kind, getValue(node)]); - }, - }; - visit(customAST, visitor, customQueryDocumentKeys); - - expect(visited).to.deep.equal([ - ['enter', 'Document', undefined], - ['enter', 'OperationDefinition', undefined], - ['enter', 'SelectionSet', undefined], - ['enter', 'Field', undefined], - ['enter', 'Name', 'a'], - ['leave', 'Name', 'a'], - ['leave', 'Field', undefined], - ['enter', 'CustomField', undefined], - ['enter', 'Name', 'b'], - ['leave', 'Name', 'b'], - ['enter', 'SelectionSet', undefined], - ['enter', 'CustomField', undefined], - ['enter', 'Name', 'c'], - ['leave', 'Name', 'c'], - ['leave', 'CustomField', undefined], - ['leave', 'SelectionSet', undefined], - ['leave', 'CustomField', undefined], - ['leave', 'SelectionSet', undefined], - ['leave', 'OperationDefinition', undefined], - ['leave', 'Document', undefined], - ]); - }); }); describe('visitInParallel', () => { diff --git a/src/language/index.d.ts b/src/language/index.d.ts index ce965383fe..b527e4fad6 100644 --- a/src/language/index.d.ts +++ b/src/language/index.d.ts @@ -16,7 +16,6 @@ export { ASTVisitor, Visitor, VisitFn, - VisitorKeyMap, } from './visitor'; export { diff --git a/src/language/index.js b/src/language/index.js index 6055ff4fe3..914c26fb42 100644 --- a/src/language/index.js +++ b/src/language/index.js @@ -19,7 +19,7 @@ export type { ParseOptions } from './parser'; export { print } from './printer'; export { visit, visitInParallel, getVisitFn, BREAK } from './visitor'; -export type { ASTVisitor, Visitor, VisitFn, VisitorKeyMap } from './visitor'; +export type { ASTVisitor, Visitor, VisitFn } from './visitor'; export { Location, Token } from './ast'; export type { diff --git a/src/language/visitor.d.ts b/src/language/visitor.d.ts index 2f8ac29490..4631ef6a07 100644 --- a/src/language/visitor.d.ts +++ b/src/language/visitor.d.ts @@ -47,106 +47,6 @@ export type VisitFn = ( ancestors: ReadonlyArray>, ) => any; -/** - * A KeyMap describes each the traversable properties of each kind of node. - */ -export type VisitorKeyMap = { [P in keyof T]: ReadonlyArray }; - -// TODO: Should be `[]`, but that requires TypeScript@3 -type EmptyTuple = Array; - -export const QueryDocumentKeys: { - Name: EmptyTuple; - - Document: ['definitions']; - // Prettier forces trailing commas, but TS pre 3.2 doesn't allow them. - // prettier-ignore - OperationDefinition: [ - 'name', - 'variableDefinitions', - 'directives', - 'selectionSet' - ]; - VariableDefinition: ['variable', 'type', 'defaultValue', 'directives']; - Variable: ['name']; - SelectionSet: ['selections']; - Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet']; - Argument: ['name', 'value']; - - FragmentSpread: ['name', 'directives']; - InlineFragment: ['typeCondition', 'directives', 'selectionSet']; - // prettier-ignore - FragmentDefinition: [ - 'name', - // Note: fragment variable definitions are deprecated and will removed in v17.0.0 - 'variableDefinitions', - 'typeCondition', - 'directives', - 'selectionSet' - ]; - - IntValue: EmptyTuple; - FloatValue: EmptyTuple; - StringValue: EmptyTuple; - BooleanValue: EmptyTuple; - NullValue: EmptyTuple; - EnumValue: EmptyTuple; - ListValue: ['values']; - ObjectValue: ['fields']; - ObjectField: ['name', 'value']; - - Directive: ['name', 'arguments']; - - NamedType: ['name']; - ListType: ['type']; - NonNullType: ['type']; - - SchemaDefinition: ['description', 'directives', 'operationTypes']; - OperationTypeDefinition: ['type']; - - ScalarTypeDefinition: ['description', 'name', 'directives']; - // prettier-ignore - ObjectTypeDefinition: [ - 'description', - 'name', - 'interfaces', - 'directives', - 'fields' - ]; - FieldDefinition: ['description', 'name', 'arguments', 'type', 'directives']; - // prettier-ignore - InputValueDefinition: [ - 'description', - 'name', - 'type', - 'defaultValue', - 'directives' - ]; - // prettier-ignore - InterfaceTypeDefinition: [ - 'description', - 'name', - 'interfaces', - 'directives', - 'fields' - ]; - UnionTypeDefinition: ['description', 'name', 'directives', 'types']; - EnumTypeDefinition: ['description', 'name', 'directives', 'values']; - EnumValueDefinition: ['description', 'name', 'directives']; - InputObjectTypeDefinition: ['description', 'name', 'directives', 'fields']; - - DirectiveDefinition: ['description', 'name', 'arguments', 'locations']; - - SchemaExtension: ['directives', 'operationTypes']; - - ScalarTypeExtension: ['name', 'directives']; - ObjectTypeExtension: ['name', 'interfaces', 'directives', 'fields']; - InterfaceTypeExtension: ['name', 'interfaces', 'directives', 'fields']; - UnionTypeExtension: ['name', 'directives', 'types']; - EnumTypeExtension: ['name', 'directives', 'values']; - InputObjectTypeExtension: ['name', 'directives', 'fields']; -}; - export const BREAK: any; /** @@ -235,11 +135,7 @@ export const BREAK: any; * } * }) */ -export function visit( - root: ASTNode, - visitor: Visitor, - visitorKeys?: VisitorKeyMap, // default: QueryDocumentKeys -): any; +export function visit(root: ASTNode, visitor: Visitor): any; /** * Creates a new visitor instance which delegates to many visitors to run in diff --git a/src/language/visitor.js b/src/language/visitor.js index 4cf64a4f08..c118131cd8 100644 --- a/src/language/visitor.js +++ b/src/language/visitor.js @@ -39,15 +39,7 @@ export type VisitFn = ( ancestors: $ReadOnlyArray>, ) => any; -/** - * A KeyMap describes each the traversable properties of each kind of node. - */ -export type VisitorKeyMap = $ObjMap< - KindToNode, - (T) => $ReadOnlyArray<$Keys>, ->; - -export const QueryDocumentKeys: VisitorKeyMap = { +const QueryDocumentKeys = { Name: [], Document: ['definitions'], @@ -221,11 +213,7 @@ export const BREAK: { ... } = Object.freeze({}); * } * }) */ -export function visit( - root: ASTNode, - visitor: Visitor, - visitorKeys: VisitorKeyMap = QueryDocumentKeys, -): any { +export function visit(root: ASTNode, visitor: Visitor): any { /* eslint-disable no-undef-init */ let stack: any = undefined; let inArray = Array.isArray(root); @@ -330,7 +318,7 @@ export function visit( } else { stack = { inArray, index, keys, edits, prev: stack }; inArray = Array.isArray(node); - keys = inArray ? node : visitorKeys[node.kind] ?? []; + keys = inArray ? node : QueryDocumentKeys[node.kind] ?? []; index = -1; edits = []; if (parent) {