UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

195 lines (194 loc) 6.38 kB
import type { ASTNode } from './ast'; import { Kind } from './kinds'; /** * A visitor is provided to visit, it contains the collection of * relevant functions to be called during the visitor's traversal. */ export declare type ASTVisitor = EnterLeaveVisitor<ASTNode> | KindVisitor; declare type KindVisitor = { readonly [NodeT in ASTNode as NodeT['kind']]?: | ASTVisitFn<NodeT> | EnterLeaveVisitor<NodeT>; }; interface EnterLeaveVisitor<TVisitedNode extends ASTNode> { readonly enter?: ASTVisitFn<TVisitedNode>; readonly leave?: ASTVisitFn<TVisitedNode>; } /** * A visitor is comprised of visit functions, which are called on each node * during the visitor's traversal. */ export declare type ASTVisitFn<TVisitedNode extends ASTNode> = ( /** The current node being visiting. */ node: TVisitedNode, /** The index or key to this node from the parent node or Array. */ key: string | number | undefined, /** The parent immediately above this node, which may be an Array. */ parent: ASTNode | ReadonlyArray<ASTNode> | undefined, /** The key path to get to this node from the root node. */ path: ReadonlyArray<string | number>, /** * All nodes and Arrays visited before reaching parent of this node. * These correspond to array indices in `path`. * Note: ancestors includes arrays which contain the parent of visited node. */ ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>, ) => any; /** * A reducer is comprised of reducer functions which convert AST nodes into * another form. */ export declare type ASTReducer<R> = { readonly [NodeT in ASTNode as NodeT['kind']]?: { readonly enter?: ASTVisitFn<NodeT>; readonly leave: ASTReducerFn<NodeT, R>; }; }; declare type ASTReducerFn<TReducedNode extends ASTNode, R> = ( /** The current node being visiting. */ node: { [K in keyof TReducedNode]: ReducedField<TReducedNode[K], R>; }, /** The index or key to this node from the parent node or Array. */ key: string | number | undefined, /** The parent immediately above this node, which may be an Array. */ parent: ASTNode | ReadonlyArray<ASTNode> | undefined, /** The key path to get to this node from the root node. */ path: ReadonlyArray<string | number>, /** * All nodes and Arrays visited before reaching parent of this node. * These correspond to array indices in `path`. * Note: ancestors includes arrays which contain the parent of visited node. */ ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>, ) => R; declare type ReducedField<T, R> = T extends null | undefined ? T : T extends ReadonlyArray<any> ? ReadonlyArray<R> : R; /** * A KeyMap describes each the traversable properties of each kind of node. * * @deprecated Please inline it. Will be removed in v17 */ export declare type ASTVisitorKeyMap = { [NodeT in ASTNode as NodeT['kind']]?: ReadonlyArray<keyof NodeT>; }; export declare const BREAK: unknown; /** * visit() will walk through an AST using a depth-first traversal, calling * the visitor's enter function at each node in the traversal, and calling the * leave function after visiting that node and all of its child nodes. * * By returning different values from the enter and leave functions, the * behavior of the visitor can be altered, including skipping over a sub-tree of * the AST (by returning false), editing the AST by returning a value or null * to remove the value, or to stop the whole traversal by returning BREAK. * * When using visit() to edit an AST, the original AST will not be modified, and * a new version of the AST with the changes applied will be returned from the * visit function. * * ```ts * const editedAST = visit(ast, { * enter(node, key, parent, path, ancestors) { * // @return * // undefined: no action * // false: skip visiting this node * // visitor.BREAK: stop visiting altogether * // null: delete this node * // any value: replace this node with the returned value * }, * leave(node, key, parent, path, ancestors) { * // @return * // undefined: no action * // false: no action * // visitor.BREAK: stop visiting altogether * // null: delete this node * // any value: replace this node with the returned value * } * }); * ``` * * Alternatively to providing enter() and leave() functions, a visitor can * instead provide functions named the same as the kinds of AST nodes, or * enter/leave visitors at a named key, leading to three permutations of the * visitor API: * * 1) Named visitors triggered when entering a node of a specific kind. * * ```ts * visit(ast, { * Kind(node) { * // enter the "Kind" node * } * }) * ``` * * 2) Named visitors that trigger upon entering and leaving a node of a specific kind. * * ```ts * visit(ast, { * Kind: { * enter(node) { * // enter the "Kind" node * } * leave(node) { * // leave the "Kind" node * } * } * }) * ``` * * 3) Generic visitors that trigger upon entering and leaving any node. * * ```ts * visit(ast, { * enter(node) { * // enter any node * }, * leave(node) { * // leave any node * } * }) * ``` */ export declare function visit<N extends ASTNode>( root: N, visitor: ASTVisitor, visitorKeys?: ASTVisitorKeyMap, ): N; export declare function visit<R>( root: ASTNode, visitor: ASTReducer<R>, visitorKeys?: ASTVisitorKeyMap, ): R; /** * Creates a new visitor instance which delegates to many visitors to run in * parallel. Each visitor will be visited for each node before moving on. * * If a prior visitor edits a node, no following visitors will see that node. */ export declare function visitInParallel( visitors: ReadonlyArray<ASTVisitor>, ): ASTVisitor; /** * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind. */ export declare function getEnterLeaveForKind( visitor: ASTVisitor, kind: Kind, ): EnterLeaveVisitor<ASTNode>; /** * Given a visitor instance, if it is leaving or not, and a node kind, return * the function the visitor runtime should call. * * @deprecated Please use `getEnterLeaveForKind` instead. Will be removed in v17 */ export declare function getVisitFn( visitor: ASTVisitor, kind: Kind, isLeaving: boolean, ): ASTVisitFn<ASTNode> | undefined; export {};