1 | import type * as ASTv1 from '../v1/api';
|
2 | import type { VisitorKey } from '../v1/visitor-keys';
|
3 | import type WalkerPath from './path';
|
4 | export interface FullNodeTraversal<N extends ASTv1.Node> {
|
5 | enter?(node: N, path: WalkerPath<N>): void;
|
6 | exit?(node: N, path: WalkerPath<N>): void;
|
7 | keys?: KeysVisitor<N>;
|
8 | }
|
9 | export type NodeHandler<N extends ASTv1.Node> = (node: N, path: WalkerPath<N>) => ASTv1.Node | ASTv1.Node[] | undefined | void;
|
10 | export type NodeTraversal<N extends ASTv1.Node> = FullNodeTraversal<N> | NodeHandler<N>;
|
11 | export type NodeVisitor = {
|
12 | [P in keyof ASTv1.Nodes]?: NodeTraversal<ASTv1.Nodes[P]>;
|
13 | } & {
|
14 | All?: NodeTraversal<ASTv1.Node>;
|
15 | |
16 |
|
17 |
|
18 | Program?: NodeTraversal<ASTv1.Template | ASTv1.Block>;
|
19 | };
|
20 | export interface FullKeyTraversal<N extends ASTv1.Node, K extends string> {
|
21 | enter?(node: N, key: K): void;
|
22 | exit?(node: N, key: K): void;
|
23 | }
|
24 | export type KeyHandler<N extends ASTv1.Node, K extends VisitorKey<N>> = (node: N, key: K) => void;
|
25 | export type KeyTraversal<N extends ASTv1.Node, K extends VisitorKey<N>> = FullKeyTraversal<N, K> | KeyHandler<N, K>;
|
26 | export type KeysVisitor<N extends ASTv1.Node> = {
|
27 | [P in VisitorKey<N>]?: KeyTraversal<N, P>;
|
28 | } & {
|
29 | All?: KeyTraversal<N, VisitorKey<N>>;
|
30 | |
31 |
|
32 |
|
33 | Program?: KeyTraversal<ASTv1.Template | ASTv1.Block, 'body'>;
|
34 | };
|