import { Node, NodeMap } from './helpers'; import { Context, NodePath } from './nodepath'; import { AliasMap } from './aliases'; export type VisitorContext = { stopped: boolean; stop(): void; }; export type VisitorFn = (this: VisitorContext, path: NodePath, state: S) => void; export type ExpandedVisitor = { enter?: VisitorFn; leave?: VisitorFn; }; export type Visitor = VisitorFn | ExpandedVisitor; type VisitorMap = AliasMap & NodeMap & { [type: string]: never; }; type NodesFromUnion = K extends `${infer Head}|${infer Rest}` ? VisitorMap[Head] extends never ? never : NodesFromUnion extends never ? never : VisitorMap[Head] | NodesFromUnion : VisitorMap[K]; type ComputedVisitors = { [K in Keys]?: NodesFromUnion extends never ? never : Visitor, S>; }; export type Visitors = { [K in Node as `${K['type']}`]?: Visitor; } & { [K in keyof AliasMap]?: Visitor; } & { comp?: ComputedVisitors; }; export type ExpandedVisitors = { [type: string]: ExpandedVisitor | undefined; }; export type TraverseOptions = { /** Enable/disable scope information tracking */ scope?: boolean; /** Enable/disable validation in `Node` builders */ validateNodes?: boolean; /** Function to use when cloning node using `NodePath.cloneNode()` */ cloneFunction?: (node: any) => any; }; export declare class Traverser { private readonly visitors; constructor(visitors: ExpandedVisitors); visitPath(visitorCtx: VisitorContext, path: NodePath, state: S, visitedPaths: WeakSet, visitOnlyChildren?: boolean): { new: NodePath[]; unSkipped: NodePath[]; } | undefined; static expandVisitors(visitors: Visitors): ExpandedVisitors; static traverseNode(data: { node: Node; parentPath: NodePath | null; state: S | undefined; ctx: Context; visitOnlyChildren?: boolean; } & ({ expand: true; visitors: Visitors; } | { expand: false; visitors: ExpandedVisitors; })): void; } export declare const traverse: (node: NodeT, visitors: Visitors & { $?: TraverseOptions; }, state?: StateT) => void; export {};