diff --git a/integrationTests/ts/package.json b/integrationTests/ts/package.json index 9abb028334..751644900a 100644 --- a/integrationTests/ts/package.json +++ b/integrationTests/ts/package.json @@ -6,9 +6,6 @@ }, "dependencies": { "graphql": "file:../graphql.tgz", - "typescript-3.8": "npm:typescript@3.8.x", - "typescript-3.9": "npm:typescript@3.9.x", - "typescript-4.0": "npm:typescript@4.0.x", "typescript-4.1": "npm:typescript@4.1.x", "typescript-4.2": "npm:typescript@4.2.x", "typescript-4.3": "npm:typescript@4.3.x", diff --git a/src/language/ast.ts b/src/language/ast.ts index af2b7fd7ee..fa2ac75e57 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -184,57 +184,15 @@ export type ASTNode = /** * Utility type listing all nodes indexed by their kind. */ -export interface ASTKindToNode { - Name: NameNode; - Document: DocumentNode; - OperationDefinition: OperationDefinitionNode; - VariableDefinition: VariableDefinitionNode; - Variable: VariableNode; - SelectionSet: SelectionSetNode; - Field: FieldNode; - Argument: ArgumentNode; - FragmentSpread: FragmentSpreadNode; - InlineFragment: InlineFragmentNode; - FragmentDefinition: FragmentDefinitionNode; - IntValue: IntValueNode; - FloatValue: FloatValueNode; - StringValue: StringValueNode; - BooleanValue: BooleanValueNode; - NullValue: NullValueNode; - EnumValue: EnumValueNode; - ListValue: ListValueNode; - ObjectValue: ObjectValueNode; - ObjectField: ObjectFieldNode; - Directive: DirectiveNode; - NamedType: NamedTypeNode; - ListType: ListTypeNode; - NonNullType: NonNullTypeNode; - SchemaDefinition: SchemaDefinitionNode; - OperationTypeDefinition: OperationTypeDefinitionNode; - ScalarTypeDefinition: ScalarTypeDefinitionNode; - ObjectTypeDefinition: ObjectTypeDefinitionNode; - FieldDefinition: FieldDefinitionNode; - InputValueDefinition: InputValueDefinitionNode; - InterfaceTypeDefinition: InterfaceTypeDefinitionNode; - UnionTypeDefinition: UnionTypeDefinitionNode; - EnumTypeDefinition: EnumTypeDefinitionNode; - EnumValueDefinition: EnumValueDefinitionNode; - InputObjectTypeDefinition: InputObjectTypeDefinitionNode; - DirectiveDefinition: DirectiveDefinitionNode; - SchemaExtension: SchemaExtensionNode; - ScalarTypeExtension: ScalarTypeExtensionNode; - ObjectTypeExtension: ObjectTypeExtensionNode; - InterfaceTypeExtension: InterfaceTypeExtensionNode; - UnionTypeExtension: UnionTypeExtensionNode; - EnumTypeExtension: EnumTypeExtensionNode; - InputObjectTypeExtension: InputObjectTypeExtensionNode; -} +export type ASTKindToNode = { + [NodeT in ASTNode as NodeT['kind']]: NodeT; +}; /** * @internal */ export const QueryDocumentKeys: { - [P in keyof ASTKindToNode]: ReadonlyArray; + [NodeT in ASTNode as NodeT['kind']]: ReadonlyArray; } = { Name: [], diff --git a/src/language/visitor.ts b/src/language/visitor.ts index eb018214a4..06ca5aa161 100644 --- a/src/language/visitor.ts +++ b/src/language/visitor.ts @@ -1,7 +1,7 @@ import { inspect } from '../jsutils/inspect'; import { devAssert } from '../jsutils/devAssert'; -import type { ASTNode, ASTKindToNode } from './ast'; +import type { ASTNode } from './ast'; import { isNode, QueryDocumentKeys } from './ast'; import { Kind } from './kinds'; @@ -12,9 +12,9 @@ import { Kind } from './kinds'; export type ASTVisitor = EnterLeaveVisitor | KindVisitor; type KindVisitor = { - readonly [K in keyof ASTKindToNode]?: - | ASTVisitFn - | EnterLeaveVisitor; + readonly [NodeT in ASTNode as NodeT['kind']]?: + | ASTVisitFn + | EnterLeaveVisitor; }; interface EnterLeaveVisitor { @@ -48,9 +48,9 @@ export type ASTVisitFn = ( * another form. */ export type ASTReducer = { - readonly [K in keyof ASTKindToNode]?: { - readonly enter?: ASTVisitFn; - readonly leave: ASTReducerFn; + readonly [NodeT in ASTNode as NodeT['kind']]?: { + readonly enter?: ASTVisitFn; + readonly leave: ASTReducerFn; }; }; @@ -79,9 +79,11 @@ type ReducedField = T extends null | undefined /** * A KeyMap describes each the traversable properties of each kind of node. + * + * @deprecated Please inline it. Will be removed in v17 */ export type ASTVisitorKeyMap = { - [P in keyof ASTKindToNode]?: ReadonlyArray; + [NodeT in ASTNode as NodeT['kind']]?: ReadonlyArray; }; export const BREAK: unknown = Object.freeze({}); @@ -179,11 +181,7 @@ export function visit( visitor: ASTVisitor | ASTReducer, visitorKeys: ASTVisitorKeyMap = QueryDocumentKeys, ): any { - const enterLeaveMap = new Map< - keyof ASTKindToNode, - EnterLeaveVisitor - >(); - + const enterLeaveMap = new Map>(); for (const kind of Object.values(Kind)) { enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind)); } @@ -380,7 +378,7 @@ export function visitInParallel( */ export function getEnterLeaveForKind( visitor: ASTVisitor, - kind: keyof ASTKindToNode, + kind: Kind, ): EnterLeaveVisitor { const kindVisitor: | ASTVisitFn @@ -408,7 +406,7 @@ export function getEnterLeaveForKind( // istanbul ignore next (Deprecated code) export function getVisitFn( visitor: ASTVisitor, - kind: keyof ASTKindToNode, + kind: Kind, isLeaving: boolean, ): ASTVisitFn | undefined { const { enter, leave } = getEnterLeaveForKind(visitor, kind);