@sunspirytus/xflow-hook 1.0.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +21 -0
- package/dist/index.umd.js +2 -0
- package/dist/index.umd.js.map +1 -0
- package/es/index.d.ts +20 -0
- package/es/index.js +97 -0
- package/es/index.js.map +1 -0
- package/es/index.spec.d.ts +1 -0
- package/es/index.spec.js +184 -0
- package/es/index.spec.js.map +1 -0
- package/es/interface.d.ts +39 -0
- package/es/interface.js +9 -0
- package/es/interface.js.map +1 -0
- package/es/utils.d.ts +31 -0
- package/es/utils.js +112 -0
- package/es/utils.js.map +1 -0
- package/es/utils.spec.d.ts +1 -0
- package/es/utils.spec.js +107 -0
- package/es/utils.spec.js.map +1 -0
- package/lib/index.d.ts +20 -0
- package/lib/index.js +145 -0
- package/lib/index.js.map +1 -0
- package/lib/index.spec.d.ts +1 -0
- package/lib/index.spec.js +274 -0
- package/lib/index.spec.js.map +1 -0
- package/lib/interface.d.ts +39 -0
- package/lib/interface.js +12 -0
- package/lib/interface.js.map +1 -0
- package/lib/utils.d.ts +31 -0
- package/lib/utils.js +133 -0
- package/lib/utils.js.map +1 -0
- package/lib/utils.spec.d.ts +1 -0
- package/lib/utils.spec.js +136 -0
- package/lib/utils.spec.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
5
|
+
var index_1 = require("./index");
|
|
6
|
+
describe('test HookHub class', function () {
|
|
7
|
+
var spy = {
|
|
8
|
+
console: jest.spyOn(console, 'log').mockImplementation(function () { }),
|
|
9
|
+
};
|
|
10
|
+
beforeEach(function () {
|
|
11
|
+
/** 监听console调用, 屏蔽console msg */
|
|
12
|
+
spy.console = jest.spyOn(console, 'log').mockImplementation(function () { });
|
|
13
|
+
});
|
|
14
|
+
afterEach(function () {
|
|
15
|
+
spy.console.mockClear();
|
|
16
|
+
});
|
|
17
|
+
var mockHandler = jest.fn();
|
|
18
|
+
test('HookHub should get empty hooks list after init ', function () {
|
|
19
|
+
var hooks = new index_1.HookHub();
|
|
20
|
+
expect(hooks.getHooks()).toHaveLength(0);
|
|
21
|
+
});
|
|
22
|
+
test('HookHub can register hooks and dispose', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
23
|
+
var hooks, hookMeta, disposable, innerHooks, _a;
|
|
24
|
+
return tslib_1.__generator(this, function (_b) {
|
|
25
|
+
switch (_b.label) {
|
|
26
|
+
case 0:
|
|
27
|
+
hooks = new index_1.HookHub();
|
|
28
|
+
hookMeta = {
|
|
29
|
+
name: 'hook1',
|
|
30
|
+
handler: mockHandler,
|
|
31
|
+
};
|
|
32
|
+
disposable = hooks.registerHook(hookMeta);
|
|
33
|
+
expect(disposable).toMatchObject({
|
|
34
|
+
dispose: expect.any(Function),
|
|
35
|
+
});
|
|
36
|
+
return [4 /*yield*/, hooks.getHooks([], false)];
|
|
37
|
+
case 1:
|
|
38
|
+
innerHooks = _b.sent();
|
|
39
|
+
expect(innerHooks).toHaveLength(1);
|
|
40
|
+
expect(innerHooks).toMatchObject([hookMeta]);
|
|
41
|
+
disposable.dispose();
|
|
42
|
+
_a = expect;
|
|
43
|
+
return [4 /*yield*/, hooks.getHooks([])];
|
|
44
|
+
case 2:
|
|
45
|
+
_a.apply(void 0, [_b.sent()]).toHaveLength(0);
|
|
46
|
+
return [2 /*return*/];
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}); });
|
|
50
|
+
test('HookHub can sort hooks by using before after ', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
51
|
+
var hooks, hookMeta, disposable, innerHooks, _a;
|
|
52
|
+
return tslib_1.__generator(this, function (_b) {
|
|
53
|
+
switch (_b.label) {
|
|
54
|
+
case 0:
|
|
55
|
+
hooks = new index_1.HookHub();
|
|
56
|
+
hookMeta = {
|
|
57
|
+
name: 'hook1',
|
|
58
|
+
handler: mockHandler,
|
|
59
|
+
};
|
|
60
|
+
disposable = hooks.registerHook(hookMeta);
|
|
61
|
+
expect(disposable).toMatchObject({
|
|
62
|
+
dispose: expect.any(Function),
|
|
63
|
+
});
|
|
64
|
+
return [4 /*yield*/, hooks.getHooks([], true)];
|
|
65
|
+
case 1:
|
|
66
|
+
innerHooks = _b.sent();
|
|
67
|
+
expect(innerHooks).toHaveLength(1);
|
|
68
|
+
expect(innerHooks).toMatchObject([hookMeta]);
|
|
69
|
+
disposable.dispose();
|
|
70
|
+
_a = expect;
|
|
71
|
+
return [4 /*yield*/, hooks.getHooks([])];
|
|
72
|
+
case 2:
|
|
73
|
+
_a.apply(void 0, [_b.sent()]).toHaveLength(0);
|
|
74
|
+
return [2 /*return*/];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}); });
|
|
78
|
+
test('HookHub can call hooks ', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
79
|
+
var hooks, hookMeta, count10, count1000;
|
|
80
|
+
return tslib_1.__generator(this, function (_a) {
|
|
81
|
+
switch (_a.label) {
|
|
82
|
+
case 0:
|
|
83
|
+
hooks = new index_1.HookHub();
|
|
84
|
+
hookMeta = {
|
|
85
|
+
name: 'count_add_one',
|
|
86
|
+
handler: function (args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
87
|
+
return tslib_1.__generator(this, function (_a) {
|
|
88
|
+
args.count = args.count + 1;
|
|
89
|
+
return [2 /*return*/];
|
|
90
|
+
});
|
|
91
|
+
}); },
|
|
92
|
+
};
|
|
93
|
+
hooks.registerHook(hookMeta);
|
|
94
|
+
return [4 /*yield*/, hooks.call({ count: 0 }, function (args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
95
|
+
var count;
|
|
96
|
+
return tslib_1.__generator(this, function (_a) {
|
|
97
|
+
count = args.count;
|
|
98
|
+
return [2 /*return*/, tslib_1.__assign(tslib_1.__assign({}, args), { count: count * 10 + '' })];
|
|
99
|
+
});
|
|
100
|
+
}); })];
|
|
101
|
+
case 1:
|
|
102
|
+
count10 = _a.sent();
|
|
103
|
+
expect(count10).toMatchObject({
|
|
104
|
+
count: '10',
|
|
105
|
+
});
|
|
106
|
+
return [4 /*yield*/, hooks.call({ count: 0 }, function (args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
107
|
+
var count;
|
|
108
|
+
return tslib_1.__generator(this, function (_a) {
|
|
109
|
+
count = args.count;
|
|
110
|
+
return [2 /*return*/, tslib_1.__assign(tslib_1.__assign({}, args), { count: count * 10 + '' })];
|
|
111
|
+
});
|
|
112
|
+
}); }, [
|
|
113
|
+
{
|
|
114
|
+
name: 'set count to 100',
|
|
115
|
+
handler: function (args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
116
|
+
return tslib_1.__generator(this, function (_a) {
|
|
117
|
+
args.count = 100;
|
|
118
|
+
return [2 /*return*/];
|
|
119
|
+
});
|
|
120
|
+
}); },
|
|
121
|
+
},
|
|
122
|
+
])];
|
|
123
|
+
case 2:
|
|
124
|
+
count1000 = _a.sent();
|
|
125
|
+
expect(count1000).toMatchObject({
|
|
126
|
+
count: '1000',
|
|
127
|
+
});
|
|
128
|
+
return [2 /*return*/];
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}); });
|
|
132
|
+
test('HookHub hooks can use return null to skip main handler', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
133
|
+
var hooks, hookMeta, mainHandler, firstHookHandler, secondHookHandler, thirdHookHandler;
|
|
134
|
+
return tslib_1.__generator(this, function (_a) {
|
|
135
|
+
switch (_a.label) {
|
|
136
|
+
case 0:
|
|
137
|
+
hooks = new index_1.HookHub();
|
|
138
|
+
hookMeta = {
|
|
139
|
+
name: 'count_add_one',
|
|
140
|
+
handler: function (args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
141
|
+
return tslib_1.__generator(this, function (_a) {
|
|
142
|
+
args.count = args.count + 1;
|
|
143
|
+
return [2 /*return*/];
|
|
144
|
+
});
|
|
145
|
+
}); },
|
|
146
|
+
};
|
|
147
|
+
hooks.registerHook(hookMeta);
|
|
148
|
+
mainHandler = jest.fn(function (_x) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
149
|
+
return tslib_1.__generator(this, function (_a) {
|
|
150
|
+
console.log('it never run since second hook return null');
|
|
151
|
+
return [2 /*return*/, {
|
|
152
|
+
count: '',
|
|
153
|
+
}];
|
|
154
|
+
});
|
|
155
|
+
}); });
|
|
156
|
+
firstHookHandler = jest.fn(function (args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
157
|
+
return tslib_1.__generator(this, function (_a) {
|
|
158
|
+
console.log('it will run');
|
|
159
|
+
args.count = 100;
|
|
160
|
+
return [2 /*return*/];
|
|
161
|
+
});
|
|
162
|
+
}); });
|
|
163
|
+
secondHookHandler = jest.fn(function (_args, _handler) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
164
|
+
return tslib_1.__generator(this, function (_a) {
|
|
165
|
+
console.log('it will stop here');
|
|
166
|
+
return [2 /*return*/, null];
|
|
167
|
+
});
|
|
168
|
+
}); });
|
|
169
|
+
thirdHookHandler = jest.fn(function (_args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
170
|
+
return tslib_1.__generator(this, function (_a) {
|
|
171
|
+
console.log('it cannot run');
|
|
172
|
+
return [2 /*return*/];
|
|
173
|
+
});
|
|
174
|
+
}); });
|
|
175
|
+
// call hook handler
|
|
176
|
+
return [4 /*yield*/, hooks.call({ count: 0 }, mainHandler, [
|
|
177
|
+
{
|
|
178
|
+
name: 'it will run',
|
|
179
|
+
handler: firstHookHandler,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: 'it will run and stop here',
|
|
183
|
+
handler: secondHookHandler,
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: 'it cannot run',
|
|
187
|
+
handler: thirdHookHandler,
|
|
188
|
+
},
|
|
189
|
+
])];
|
|
190
|
+
case 1:
|
|
191
|
+
// call hook handler
|
|
192
|
+
_a.sent();
|
|
193
|
+
expect(spy.console).toBeCalledTimes(2);
|
|
194
|
+
expect(firstHookHandler).toBeCalledTimes(1);
|
|
195
|
+
expect(secondHookHandler).toBeCalledTimes(1);
|
|
196
|
+
expect(thirdHookHandler).toBeCalledTimes(0);
|
|
197
|
+
expect(mainHandler.mock.calls.length).toBe(0);
|
|
198
|
+
return [2 /*return*/];
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}); });
|
|
202
|
+
test('HookHub hooks can wrap main handler', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
203
|
+
var hooks, hookMeta, mainHandler, firstHookHandler, secondHookHandler;
|
|
204
|
+
return tslib_1.__generator(this, function (_a) {
|
|
205
|
+
switch (_a.label) {
|
|
206
|
+
case 0:
|
|
207
|
+
hooks = new index_1.HookHub();
|
|
208
|
+
hookMeta = {
|
|
209
|
+
name: 'count_add_one',
|
|
210
|
+
handler: function (args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
211
|
+
return tslib_1.__generator(this, function (_a) {
|
|
212
|
+
args.count = args.count + 1;
|
|
213
|
+
return [2 /*return*/];
|
|
214
|
+
});
|
|
215
|
+
}); },
|
|
216
|
+
};
|
|
217
|
+
hooks.registerHook(hookMeta);
|
|
218
|
+
mainHandler = jest.fn(function (_x) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
219
|
+
return tslib_1.__generator(this, function (_a) {
|
|
220
|
+
console.log('run main handler');
|
|
221
|
+
return [2 /*return*/, {
|
|
222
|
+
count: '100',
|
|
223
|
+
}];
|
|
224
|
+
});
|
|
225
|
+
}); });
|
|
226
|
+
firstHookHandler = jest.fn(function (args) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
227
|
+
return tslib_1.__generator(this, function (_a) {
|
|
228
|
+
console.log('run first hook handler');
|
|
229
|
+
args.count = 100;
|
|
230
|
+
return [2 /*return*/];
|
|
231
|
+
});
|
|
232
|
+
}); });
|
|
233
|
+
secondHookHandler = jest.fn(function (_args, handler) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
234
|
+
var newHandler;
|
|
235
|
+
return tslib_1.__generator(this, function (_a) {
|
|
236
|
+
console.log('run second hook handler');
|
|
237
|
+
newHandler = function (args) {
|
|
238
|
+
console.log('run before main handler');
|
|
239
|
+
var result = handler.call(null, args);
|
|
240
|
+
console.log('run after main handler');
|
|
241
|
+
return result;
|
|
242
|
+
};
|
|
243
|
+
return [2 /*return*/, newHandler];
|
|
244
|
+
});
|
|
245
|
+
}); });
|
|
246
|
+
// call hook handler
|
|
247
|
+
return [4 /*yield*/, hooks.call({ count: 0 }, mainHandler, [
|
|
248
|
+
{
|
|
249
|
+
name: 'first runtime hook',
|
|
250
|
+
handler: firstHookHandler,
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
name: 'it will wrap main handler',
|
|
254
|
+
handler: secondHookHandler,
|
|
255
|
+
},
|
|
256
|
+
])];
|
|
257
|
+
case 1:
|
|
258
|
+
// call hook handler
|
|
259
|
+
_a.sent();
|
|
260
|
+
expect(mainHandler.mock.calls.length).toBe(1);
|
|
261
|
+
expect(spy.console).toHaveBeenCalledTimes(5);
|
|
262
|
+
expect(spy.console.mock.calls).toEqual([
|
|
263
|
+
['run first hook handler'],
|
|
264
|
+
['run second hook handler'],
|
|
265
|
+
['run before main handler'],
|
|
266
|
+
['run main handler'],
|
|
267
|
+
['run after main handler'],
|
|
268
|
+
]);
|
|
269
|
+
return [2 /*return*/];
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}); });
|
|
273
|
+
});
|
|
274
|
+
//# sourceMappingURL=index.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** 定义一个hook,注册的逻辑放在handler中 */
|
|
2
|
+
export interface IHook<Args = any, Result = any> {
|
|
3
|
+
name: string;
|
|
4
|
+
handler: (args: Args, mainHandler?: IMainHandler<Args, Result>) => Promise<null | void | IMainHandler<Args, Result>>;
|
|
5
|
+
after?: string;
|
|
6
|
+
before?: string;
|
|
7
|
+
}
|
|
8
|
+
/** 运行时的hook参数 */
|
|
9
|
+
export type IRuntimeHook<Args = any, Result = any> = IHook<Args, Result> | IHook<Args, Result>[];
|
|
10
|
+
/** IHookHub的handler回调 */
|
|
11
|
+
export interface IMainHandler<Args = any, Result = any> {
|
|
12
|
+
(args: Args): Promise<Result>;
|
|
13
|
+
}
|
|
14
|
+
/** hookhub是多个hook的集合 */
|
|
15
|
+
export interface IHookHub<Args, Result> {
|
|
16
|
+
/** 注册hook */
|
|
17
|
+
registerHook: (hookConfig: IHook) => Disposable;
|
|
18
|
+
/** 执行所有hook */
|
|
19
|
+
call: (args: Args, handler: IMainHandler<Args, Result>, hookMetas?: IRuntimeHook<Args>) => Promise<Result | undefined>;
|
|
20
|
+
}
|
|
21
|
+
/** hooks 执行的策略 */
|
|
22
|
+
export declare enum ScheduleTypeEnum {
|
|
23
|
+
/** pipeline串行执行:所有async任务完成后再执行回调 */
|
|
24
|
+
'ASYNC_SRRIES' = "ASYNC_SRRIES",
|
|
25
|
+
/** async并行执行:等待Promise.all所有async任务后再执行回调 */
|
|
26
|
+
'ASYNC_PARALLEL' = "ASYNC_PARALLEL"
|
|
27
|
+
}
|
|
28
|
+
/** 执行的策略 */
|
|
29
|
+
export interface ScheduleOptions {
|
|
30
|
+
type: ScheduleTypeEnum;
|
|
31
|
+
options: any;
|
|
32
|
+
}
|
|
33
|
+
/** 可Dispose的对象 */
|
|
34
|
+
export interface Disposable {
|
|
35
|
+
/**
|
|
36
|
+
* Dispose this object.
|
|
37
|
+
*/
|
|
38
|
+
dispose: () => void;
|
|
39
|
+
}
|
package/lib/interface.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScheduleTypeEnum = void 0;
|
|
4
|
+
/** hooks 执行的策略 */
|
|
5
|
+
var ScheduleTypeEnum;
|
|
6
|
+
(function (ScheduleTypeEnum) {
|
|
7
|
+
/** pipeline串行执行:所有async任务完成后再执行回调 */
|
|
8
|
+
ScheduleTypeEnum["ASYNC_SRRIES"] = "ASYNC_SRRIES";
|
|
9
|
+
/** async并行执行:等待Promise.all所有async任务后再执行回调 */
|
|
10
|
+
ScheduleTypeEnum["ASYNC_PARALLEL"] = "ASYNC_PARALLEL";
|
|
11
|
+
})(ScheduleTypeEnum = exports.ScheduleTypeEnum || (exports.ScheduleTypeEnum = {}));
|
|
12
|
+
//# sourceMappingURL=interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":";;;AA+BA,kBAAkB;AAClB,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,qCAAqC;IACrC,iDAA+B,CAAA;IAC/B,6CAA6C;IAC7C,qDAAmC,CAAA;AACrC,CAAC,EALW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAK3B"}
|
package/lib/utils.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { IHook } from './interface';
|
|
2
|
+
export declare namespace ErrorUtils {
|
|
3
|
+
enum ErrorEnum {
|
|
4
|
+
'INVALID_HOOK_BEFORE' = "INVALID_HOOK_BEFORE",
|
|
5
|
+
'INVALID_HOOK_AFTER' = "INVALID_HOOK_AFTER",
|
|
6
|
+
'INVALID_HOOK_ARGS_LENGTH' = "INVALID_HOOK_ARGS_LENGTH"
|
|
7
|
+
}
|
|
8
|
+
class HookError extends Error {
|
|
9
|
+
private code;
|
|
10
|
+
contexts: Record<string, any>;
|
|
11
|
+
constructor(code: string, message: string | string[], ...contexts: any[]);
|
|
12
|
+
toString(): string;
|
|
13
|
+
}
|
|
14
|
+
const HookBeforeError: () => HookError;
|
|
15
|
+
const HookAfterError: () => HookError;
|
|
16
|
+
const InvalidHookArguments: (hook: IHook) => HookError;
|
|
17
|
+
}
|
|
18
|
+
export declare namespace HookUtils {
|
|
19
|
+
/** 处理 runtime hooks */
|
|
20
|
+
const normalize: (hookConfig: IHook | IHook[], hookMap: Map<string, IHook>) => IHook[];
|
|
21
|
+
/** 排序 hooks */
|
|
22
|
+
const sort: (hooks: IHook[], hookMap: Map<string, IHook>) => IHook[];
|
|
23
|
+
}
|
|
24
|
+
export declare class Deferred<T> {
|
|
25
|
+
isResolved: boolean;
|
|
26
|
+
isRejected: boolean;
|
|
27
|
+
resolve: (value: T) => void;
|
|
28
|
+
reject: (err: any) => void;
|
|
29
|
+
promise: Promise<T>;
|
|
30
|
+
constructor();
|
|
31
|
+
}
|
package/lib/utils.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Deferred = exports.HookUtils = exports.ErrorUtils = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var toposort_1 = tslib_1.__importDefault(require("toposort"));
|
|
6
|
+
var ErrorUtils;
|
|
7
|
+
(function (ErrorUtils) {
|
|
8
|
+
var ErrorEnum;
|
|
9
|
+
(function (ErrorEnum) {
|
|
10
|
+
ErrorEnum["INVALID_HOOK_BEFORE"] = "INVALID_HOOK_BEFORE";
|
|
11
|
+
ErrorEnum["INVALID_HOOK_AFTER"] = "INVALID_HOOK_AFTER";
|
|
12
|
+
ErrorEnum["INVALID_HOOK_ARGS_LENGTH"] = "INVALID_HOOK_ARGS_LENGTH";
|
|
13
|
+
})(ErrorEnum = ErrorUtils.ErrorEnum || (ErrorUtils.ErrorEnum = {}));
|
|
14
|
+
var HookError = /** @class */ (function (_super) {
|
|
15
|
+
tslib_1.__extends(HookError, _super);
|
|
16
|
+
function HookError(code, message) {
|
|
17
|
+
var contexts = [];
|
|
18
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
19
|
+
contexts[_i - 2] = arguments[_i];
|
|
20
|
+
}
|
|
21
|
+
var _this = this;
|
|
22
|
+
if (Array.isArray(message)) {
|
|
23
|
+
message = message
|
|
24
|
+
.filter(function (line) {
|
|
25
|
+
return !!line;
|
|
26
|
+
})
|
|
27
|
+
.join(' ');
|
|
28
|
+
}
|
|
29
|
+
_this = _super.call(this, "".concat(code, ": ").concat(message)) || this;
|
|
30
|
+
if (Error.captureStackTrace) {
|
|
31
|
+
;
|
|
32
|
+
Error.captureStackTrace(_this, HookError);
|
|
33
|
+
}
|
|
34
|
+
_this.code = code;
|
|
35
|
+
_this.contexts = {};
|
|
36
|
+
contexts.forEach(function (context) {
|
|
37
|
+
if (typeof context === 'object') {
|
|
38
|
+
Object.entries(context).forEach(function (pair) {
|
|
39
|
+
var key = pair[0], value = pair[1];
|
|
40
|
+
if (key !== 'key' && value) {
|
|
41
|
+
_this.contexts[key] = JSON.parse(JSON.stringify(value));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return _this;
|
|
47
|
+
}
|
|
48
|
+
HookError.prototype.toString = function () {
|
|
49
|
+
return "".concat(this.code, ": ").concat(this.message);
|
|
50
|
+
};
|
|
51
|
+
return HookError;
|
|
52
|
+
}(Error));
|
|
53
|
+
ErrorUtils.HookError = HookError;
|
|
54
|
+
var createError = function (code, message) {
|
|
55
|
+
var args = [];
|
|
56
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
57
|
+
args[_i - 2] = arguments[_i];
|
|
58
|
+
}
|
|
59
|
+
return new (HookError.bind.apply(HookError, tslib_1.__spreadArray([void 0, code, message], args, false)))();
|
|
60
|
+
};
|
|
61
|
+
ErrorUtils.HookBeforeError = function () {
|
|
62
|
+
return createError(ErrorEnum.INVALID_HOOK_BEFORE, [
|
|
63
|
+
'hook require a before dependency but not exist in hookmap',
|
|
64
|
+
]);
|
|
65
|
+
};
|
|
66
|
+
ErrorUtils.HookAfterError = function () {
|
|
67
|
+
return createError(ErrorEnum.INVALID_HOOK_AFTER, [
|
|
68
|
+
'hook require a after dependency but not exist in hookmap',
|
|
69
|
+
]);
|
|
70
|
+
};
|
|
71
|
+
ErrorUtils.InvalidHookArguments = function (hook) {
|
|
72
|
+
return createError(ErrorEnum.INVALID_HOOK_ARGS_LENGTH, [
|
|
73
|
+
'hook handlers must have 0 to 2 arguments',
|
|
74
|
+
"but got ".concat(hook.handler.length),
|
|
75
|
+
]);
|
|
76
|
+
};
|
|
77
|
+
})(ErrorUtils = exports.ErrorUtils || (exports.ErrorUtils = {}));
|
|
78
|
+
var HookUtils;
|
|
79
|
+
(function (HookUtils) {
|
|
80
|
+
/** 处理 runtime hooks */
|
|
81
|
+
HookUtils.normalize = function (hookConfig, hookMap) {
|
|
82
|
+
if (hookConfig === void 0) { hookConfig = []; }
|
|
83
|
+
var runtimeHook = Array.isArray(hookConfig) ? hookConfig : [hookConfig];
|
|
84
|
+
var innerHooks = [];
|
|
85
|
+
hookMap.forEach(function (val) {
|
|
86
|
+
innerHooks.push(val);
|
|
87
|
+
});
|
|
88
|
+
return tslib_1.__spreadArray(tslib_1.__spreadArray([], innerHooks, true), runtimeHook, true).filter(function (item) { return item && !!item.handler; });
|
|
89
|
+
};
|
|
90
|
+
/** 排序 hooks */
|
|
91
|
+
HookUtils.sort = function (hooks, hookMap) {
|
|
92
|
+
if (hooks === void 0) { hooks = []; }
|
|
93
|
+
var edges = [];
|
|
94
|
+
hooks.forEach(function (hook) {
|
|
95
|
+
if (hook.before) {
|
|
96
|
+
if (!hookMap.has(hook.before)) {
|
|
97
|
+
throw ErrorUtils.HookBeforeError();
|
|
98
|
+
}
|
|
99
|
+
var edge = [hook, hookMap.get(hook.before)];
|
|
100
|
+
edges.push(edge);
|
|
101
|
+
}
|
|
102
|
+
if (hook.after) {
|
|
103
|
+
if (!hookMap.has(hook.after)) {
|
|
104
|
+
throw ErrorUtils.HookBeforeError();
|
|
105
|
+
}
|
|
106
|
+
var edge = [hookMap.get(hook.after), hook];
|
|
107
|
+
edges.push(edge);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
var sortedHooks = toposort_1.default.array(hooks, edges);
|
|
111
|
+
return sortedHooks;
|
|
112
|
+
};
|
|
113
|
+
})(HookUtils = exports.HookUtils || (exports.HookUtils = {}));
|
|
114
|
+
var Deferred = /** @class */ (function () {
|
|
115
|
+
function Deferred() {
|
|
116
|
+
var _this = this;
|
|
117
|
+
this.isResolved = false;
|
|
118
|
+
this.isRejected = false;
|
|
119
|
+
this.promise = new Promise(function (resolve, reject) {
|
|
120
|
+
_this.resolve = function (args) {
|
|
121
|
+
_this.isResolved = true;
|
|
122
|
+
resolve(args);
|
|
123
|
+
};
|
|
124
|
+
_this.reject = function (args) {
|
|
125
|
+
_this.isRejected = true;
|
|
126
|
+
reject(args);
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return Deferred;
|
|
131
|
+
}());
|
|
132
|
+
exports.Deferred = Deferred;
|
|
133
|
+
//# sourceMappingURL=utils.js.map
|
package/lib/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var utils_1 = require("./utils");
|
|
5
|
+
describe('sort utils', function () {
|
|
6
|
+
test('it should sort hooks when use IHook after attributes', function () {
|
|
7
|
+
var mockHandler = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
|
|
8
|
+
return [2 /*return*/];
|
|
9
|
+
}); }); };
|
|
10
|
+
var hook1 = { name: 'hook1', handler: mockHandler, after: 'hook2' };
|
|
11
|
+
var hook2 = { name: 'hook2', handler: mockHandler, after: 'hook3' };
|
|
12
|
+
var hook3 = { name: 'hook3', handler: mockHandler, after: 'hook4' };
|
|
13
|
+
var hook4 = { name: 'hook4', handler: mockHandler, after: 'hook5' };
|
|
14
|
+
var hook5 = { name: 'hook5', handler: mockHandler };
|
|
15
|
+
var hooks = [hook1, hook2, hook3, hook4, hook5];
|
|
16
|
+
var hookMap = new Map();
|
|
17
|
+
hookMap.set('hook1', hook1);
|
|
18
|
+
hookMap.set('hook2', hook2);
|
|
19
|
+
hookMap.set('hook3', hook3);
|
|
20
|
+
hookMap.set('hook4', hook4);
|
|
21
|
+
hookMap.set('hook5', hook5);
|
|
22
|
+
expect(utils_1.HookUtils.sort(hooks, hookMap)).toEqual([hook5, hook4, hook3, hook2, hook1]);
|
|
23
|
+
});
|
|
24
|
+
test('it should sort hooks when use IHook before attributes', function () {
|
|
25
|
+
var mockHandler = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
|
|
26
|
+
return [2 /*return*/];
|
|
27
|
+
}); }); };
|
|
28
|
+
var hook1 = { name: 'hook1', handler: mockHandler };
|
|
29
|
+
var hook2 = { name: 'hook2', handler: mockHandler, before: 'hook1' };
|
|
30
|
+
var hook3 = { name: 'hook3', handler: mockHandler, before: 'hook2' };
|
|
31
|
+
var hook4 = { name: 'hook4', handler: mockHandler, before: 'hook3' };
|
|
32
|
+
var hook5 = { name: 'hook5', handler: mockHandler, before: 'hook4' };
|
|
33
|
+
var hooks = [hook1, hook2, hook3, hook4, hook5];
|
|
34
|
+
var hookMap = new Map();
|
|
35
|
+
hookMap.set('hook1', hook1);
|
|
36
|
+
hookMap.set('hook2', hook2);
|
|
37
|
+
hookMap.set('hook3', hook3);
|
|
38
|
+
hookMap.set('hook4', hook4);
|
|
39
|
+
hookMap.set('hook5', hook5);
|
|
40
|
+
expect(utils_1.HookUtils.sort(hooks, hookMap)).toEqual([hook5, hook4, hook3, hook2, hook1]);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('err utils test', function () {
|
|
44
|
+
test('it can create error with context', function () {
|
|
45
|
+
// given
|
|
46
|
+
var code = 'MY ERROR';
|
|
47
|
+
var message = 'error message string';
|
|
48
|
+
var context = { a: 1, b: 2 };
|
|
49
|
+
// when
|
|
50
|
+
var err = new utils_1.ErrorUtils.HookError(code, message, context);
|
|
51
|
+
//then
|
|
52
|
+
expect(err instanceof Error).toBe(true);
|
|
53
|
+
expect(err.message).toEqual('MY ERROR: error message string');
|
|
54
|
+
expect(err.contexts.a).toEqual(1);
|
|
55
|
+
expect(err.contexts.b).toEqual(2);
|
|
56
|
+
});
|
|
57
|
+
test('it can create hook argument error', function () {
|
|
58
|
+
// given
|
|
59
|
+
var mockHandler = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
|
|
60
|
+
return [2 /*return*/];
|
|
61
|
+
}); }); };
|
|
62
|
+
var hook1 = { name: 'hook1', handler: mockHandler };
|
|
63
|
+
// when
|
|
64
|
+
var err = utils_1.ErrorUtils.InvalidHookArguments(hook1);
|
|
65
|
+
//then
|
|
66
|
+
expect(err instanceof Error).toBe(true);
|
|
67
|
+
expect(err.message).toEqual('INVALID_HOOK_ARGS_LENGTH: hook handlers must have 0 to 2 arguments but got 0');
|
|
68
|
+
});
|
|
69
|
+
test('it can create hook argument error', function () {
|
|
70
|
+
// given & when
|
|
71
|
+
var err = utils_1.ErrorUtils.HookBeforeError();
|
|
72
|
+
//then
|
|
73
|
+
expect(err instanceof Error).toBe(true);
|
|
74
|
+
expect(err.message).toEqual('INVALID_HOOK_BEFORE: hook require a before dependency but not exist in hookmap');
|
|
75
|
+
});
|
|
76
|
+
test('it can create hook argument error', function () {
|
|
77
|
+
// given & when
|
|
78
|
+
var err = utils_1.ErrorUtils.HookAfterError();
|
|
79
|
+
//then
|
|
80
|
+
expect(err instanceof Error).toBe(true);
|
|
81
|
+
expect(err.message).toEqual('INVALID_HOOK_AFTER: hook require a after dependency but not exist in hookmap');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('Deferred utils', function () {
|
|
85
|
+
test('Deferred should resolve value async', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
86
|
+
var booleanDefer, value;
|
|
87
|
+
return tslib_1.__generator(this, function (_a) {
|
|
88
|
+
switch (_a.label) {
|
|
89
|
+
case 0:
|
|
90
|
+
booleanDefer = new utils_1.Deferred();
|
|
91
|
+
// when
|
|
92
|
+
setTimeout(function () {
|
|
93
|
+
booleanDefer.resolve('successs');
|
|
94
|
+
}, 0);
|
|
95
|
+
return [4 /*yield*/, booleanDefer.promise
|
|
96
|
+
// then
|
|
97
|
+
];
|
|
98
|
+
case 1:
|
|
99
|
+
value = _a.sent();
|
|
100
|
+
// then
|
|
101
|
+
expect(value).toBe('successs');
|
|
102
|
+
expect(booleanDefer.isResolved).toBe(true);
|
|
103
|
+
expect(booleanDefer.isRejected).toBe(false);
|
|
104
|
+
return [2 /*return*/];
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}); });
|
|
108
|
+
test('Deferred should reject value async', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
109
|
+
var booleanDefer, error_1;
|
|
110
|
+
return tslib_1.__generator(this, function (_a) {
|
|
111
|
+
switch (_a.label) {
|
|
112
|
+
case 0:
|
|
113
|
+
booleanDefer = new utils_1.Deferred();
|
|
114
|
+
// when
|
|
115
|
+
setTimeout(function () {
|
|
116
|
+
booleanDefer.reject('error');
|
|
117
|
+
}, 0);
|
|
118
|
+
_a.label = 1;
|
|
119
|
+
case 1:
|
|
120
|
+
_a.trys.push([1, 3, , 4]);
|
|
121
|
+
return [4 /*yield*/, booleanDefer.promise];
|
|
122
|
+
case 2:
|
|
123
|
+
_a.sent();
|
|
124
|
+
return [3 /*break*/, 4];
|
|
125
|
+
case 3:
|
|
126
|
+
error_1 = _a.sent();
|
|
127
|
+
expect(error_1).toBe('error');
|
|
128
|
+
expect(booleanDefer.isResolved).toBe(false);
|
|
129
|
+
expect(booleanDefer.isRejected).toBe(true);
|
|
130
|
+
return [3 /*break*/, 4];
|
|
131
|
+
case 4: return [2 /*return*/];
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}); });
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=utils.spec.js.map
|