Skip to content

Commit dbeb2b5

Browse files
committed
feat(walker): tweak events
1 parent 74421c6 commit dbeb2b5

File tree

2 files changed

+26
-19
lines changed

2 files changed

+26
-19
lines changed

src/walker/types.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@ export type WalkingOptions = {
99
resolveRef: WalkerRefResolver | null;
1010
};
1111

12-
export type WalkerItem = {
13-
node: SchemaNode;
14-
parentNode: SchemaNode | null;
15-
};
16-
1712
export type WalkerSnapshot = {
1813
readonly fragment: SchemaFragment;
1914
readonly depth: number;
@@ -24,14 +19,23 @@ export type WalkerSnapshot = {
2419
export type WalkerHookAction = 'filter' | 'stepIn';
2520
export type WalkerHookHandler = (node: SchemaNode) => boolean;
2621

27-
export type WalkerEvent = 'newNode' | 'acceptNode' | 'enterNode' | 'exitNode' | 'error';
2822
export type WalkerNodeEventHandler = (node: SchemaNode) => void;
23+
export type WalkerFragmentEventHandler = (node: SchemaFragment) => void;
2924
export type WalkerErrorEventHandler = (ex: Error) => void;
3025

3126
export type WalkerEmitter = {
32-
newNode: WalkerNodeEventHandler;
33-
acceptNode: WalkerNodeEventHandler;
3427
enterNode: WalkerNodeEventHandler;
3528
exitNode: WalkerNodeEventHandler;
29+
30+
includeNode: WalkerNodeEventHandler;
31+
skipNode: WalkerNodeEventHandler;
32+
33+
stepInNode: WalkerNodeEventHandler;
34+
stepOverNode: WalkerNodeEventHandler;
35+
stepOutNode: WalkerNodeEventHandler;
36+
37+
enterFragment: WalkerFragmentEventHandler;
38+
exitFragment: WalkerFragmentEventHandler;
39+
3640
error: WalkerErrorEventHandler;
3741
};

src/walker/walker.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ export class Walker extends EventEmitter<WalkerEmitter> {
6969
}
7070

7171
public walk(): void {
72-
const {
73-
depth: initialDepth,
74-
schemaNode: initialSchemaNode,
75-
path: { length },
76-
} = this;
72+
const { depth: initialDepth, schemaNode: initialSchemaNode, fragment } = this;
73+
74+
const state = this.dumpInternalWalkerState();
75+
76+
super.emit('enterFragment', fragment);
7777

7878
for (const schemaNode of this.processFragment()) {
79-
super.emit('newNode', schemaNode);
79+
super.emit('enterNode', schemaNode);
8080

8181
this.processedFragments.set(schemaNode.fragment, schemaNode);
8282

@@ -86,6 +86,7 @@ export class Walker extends EventEmitter<WalkerEmitter> {
8686
const shouldSkipNode = this.hooks.filter?.(schemaNode);
8787

8888
if (shouldSkipNode === true) {
89+
super.emit('skipNode', schemaNode);
8990
continue;
9091
}
9192

@@ -102,23 +103,25 @@ export class Walker extends EventEmitter<WalkerEmitter> {
102103
}
103104
}
104105

105-
super.emit('acceptNode', schemaNode);
106+
super.emit('includeNode', schemaNode);
106107

107108
if (schemaNode instanceof RegularNode) {
108109
this.schemaNode = schemaNode;
109110

110111
if (this.hooks.stepIn?.(schemaNode) !== false) {
111-
super.emit('enterNode', schemaNode);
112+
super.emit('stepInNode', schemaNode);
112113
this.walkNodeChildren();
114+
super.emit('stepOutNode', schemaNode);
115+
} else {
116+
super.emit('stepOverNode', schemaNode);
113117
}
114118
}
115119

116120
super.emit('exitNode', schemaNode);
117121
}
118122

119-
this.path.length = length;
120-
this.depth = initialDepth;
121-
this.schemaNode = initialSchemaNode;
123+
this.restoreInternalWalkerState(state);
124+
super.emit('exitFragment', fragment);
122125
}
123126

124127
protected dumpInternalWalkerState(): InternalWalkerState {

0 commit comments

Comments
 (0)