-
-
Notifications
You must be signed in to change notification settings - Fork 47
/
get-hooks.ts
95 lines (80 loc) · 2.32 KB
/
get-hooks.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { HookMetadataArgs } from "../metadata/hook.ts";
import { RouteMetadata } from "../metadata/route.ts";
type GroupedHooks<TState, TPayload> = {
areaHooks: HookMetadataArgs<TState, TPayload>[];
controllerHooks: HookMetadataArgs<TState, TPayload>[];
actionHooks: HookMetadataArgs<TState, TPayload>[];
};
export function getGroupedHooks<TState, TPayload>(
hooks: HookMetadataArgs<TState, TPayload>[],
action: RouteMetadata,
): GroupedHooks<TState, TPayload> {
let result: GroupedHooks<TState, TPayload> = {
areaHooks: [],
controllerHooks: [],
actionHooks: [],
};
if (hooks.length > 0) {
const group = getGrouped(hooks, action);
result = {
areaHooks: group.areaHooks,
controllerHooks: group.controllerHooks,
actionHooks: group.actionHooks,
};
}
return result;
}
/**
* Gets hooks in runtime
* @param hooks
* @param action
*/
export function getHooksForAction<TState, TPayload>(
hooks: HookMetadataArgs<TState, TPayload>[],
action: RouteMetadata,
): HookMetadataArgs<TState, TPayload>[] | undefined {
const group = getGrouped(hooks, action);
return [...group.areaHooks, ...group.controllerHooks, ...group.actionHooks];
}
/**
* Gets hooks from metadata
* @param hooks
* @param action
*/
export function getHooksFromAction<TState, TPayload>(
action: RouteMetadata,
): HookMetadataArgs<TState, TPayload>[] | undefined {
const metadata = action.actionMetadata;
const actionHooks = metadata.hooks || [];
return [
...metadata.controller!.area!.hooks,
...metadata.controller!.hooks,
...actionHooks,
];
}
function getGrouped<TState, TPayload>(
hooks: HookMetadataArgs<TState, TPayload>[],
action: RouteMetadata,
): GroupedHooks<TState, TPayload> {
const areaHooks: HookMetadataArgs<TState, TPayload>[] = [];
const controllerHooks: HookMetadataArgs<TState, TPayload>[] = [];
const actionHooks: HookMetadataArgs<TState, TPayload>[] = [];
for (let hook of hooks) {
if (hook.object === action.areaObject) {
areaHooks.push(hook);
continue;
}
if (hook.object === action.controllerObject) {
controllerHooks.push(hook);
continue;
}
if (hook.object === action.actionObject && hook.method === action.action) {
actionHooks.push(hook);
}
}
return {
areaHooks,
controllerHooks,
actionHooks,
};
}