@logosdx/hooks 1.0.0-beta.0
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/CHANGELOG.md +15 -0
- package/LICENSE +12 -0
- package/dist/browser/bundle.js +2 -0
- package/dist/browser/bundle.js.map +1 -0
- package/dist/cjs/index.js +796 -0
- package/dist/esm/index.mjs +830 -0
- package/dist/types/index.d.ts +228 -0
- package/package.json +36 -0
- package/readme.md +88 -0
- package/src/index.ts +440 -0
|
@@ -0,0 +1,796 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get HookEngine () {
|
|
13
|
+
return HookEngine;
|
|
14
|
+
},
|
|
15
|
+
get HookError () {
|
|
16
|
+
return HookError;
|
|
17
|
+
},
|
|
18
|
+
get isHookError () {
|
|
19
|
+
return isHookError;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
var _utils = require("@logosdx/utils");
|
|
23
|
+
function _array_like_to_array(arr, len) {
|
|
24
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
25
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
26
|
+
return arr2;
|
|
27
|
+
}
|
|
28
|
+
function _array_with_holes(arr) {
|
|
29
|
+
if (Array.isArray(arr)) return arr;
|
|
30
|
+
}
|
|
31
|
+
function _assert_this_initialized(self) {
|
|
32
|
+
if (self === void 0) {
|
|
33
|
+
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
34
|
+
}
|
|
35
|
+
return self;
|
|
36
|
+
}
|
|
37
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
38
|
+
try {
|
|
39
|
+
var info = gen[key](arg);
|
|
40
|
+
var value = info.value;
|
|
41
|
+
} catch (error) {
|
|
42
|
+
reject(error);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (info.done) {
|
|
46
|
+
resolve(value);
|
|
47
|
+
} else {
|
|
48
|
+
Promise.resolve(value).then(_next, _throw);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function _async_to_generator(fn) {
|
|
52
|
+
return function() {
|
|
53
|
+
var self = this, args = arguments;
|
|
54
|
+
return new Promise(function(resolve, reject) {
|
|
55
|
+
var gen = fn.apply(self, args);
|
|
56
|
+
function _next(value) {
|
|
57
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
58
|
+
}
|
|
59
|
+
function _throw(err) {
|
|
60
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
61
|
+
}
|
|
62
|
+
_next(undefined);
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function _call_super(_this, derived, args) {
|
|
67
|
+
derived = _get_prototype_of(derived);
|
|
68
|
+
return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
|
|
69
|
+
}
|
|
70
|
+
function _check_private_redeclaration(obj, privateCollection) {
|
|
71
|
+
if (privateCollection.has(obj)) {
|
|
72
|
+
throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function _class_apply_descriptor_get(receiver, descriptor) {
|
|
76
|
+
if (descriptor.get) {
|
|
77
|
+
return descriptor.get.call(receiver);
|
|
78
|
+
}
|
|
79
|
+
return descriptor.value;
|
|
80
|
+
}
|
|
81
|
+
function _class_apply_descriptor_set(receiver, descriptor, value) {
|
|
82
|
+
if (descriptor.set) {
|
|
83
|
+
descriptor.set.call(receiver, value);
|
|
84
|
+
} else {
|
|
85
|
+
if (!descriptor.writable) {
|
|
86
|
+
throw new TypeError("attempted to set read only private field");
|
|
87
|
+
}
|
|
88
|
+
descriptor.value = value;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function _class_call_check(instance, Constructor) {
|
|
92
|
+
if (!(instance instanceof Constructor)) {
|
|
93
|
+
throw new TypeError("Cannot call a class as a function");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function _class_extract_field_descriptor(receiver, privateMap, action) {
|
|
97
|
+
if (!privateMap.has(receiver)) {
|
|
98
|
+
throw new TypeError("attempted to " + action + " private field on non-instance");
|
|
99
|
+
}
|
|
100
|
+
return privateMap.get(receiver);
|
|
101
|
+
}
|
|
102
|
+
function _class_private_field_get(receiver, privateMap) {
|
|
103
|
+
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
|
|
104
|
+
return _class_apply_descriptor_get(receiver, descriptor);
|
|
105
|
+
}
|
|
106
|
+
function _class_private_field_init(obj, privateMap, value) {
|
|
107
|
+
_check_private_redeclaration(obj, privateMap);
|
|
108
|
+
privateMap.set(obj, value);
|
|
109
|
+
}
|
|
110
|
+
function _class_private_field_set(receiver, privateMap, value) {
|
|
111
|
+
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
|
|
112
|
+
_class_apply_descriptor_set(receiver, descriptor, value);
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
function _construct(Parent, args, Class) {
|
|
116
|
+
if (_is_native_reflect_construct()) {
|
|
117
|
+
_construct = Reflect.construct;
|
|
118
|
+
} else {
|
|
119
|
+
_construct = function construct(Parent, args, Class) {
|
|
120
|
+
var a = [
|
|
121
|
+
null
|
|
122
|
+
];
|
|
123
|
+
a.push.apply(a, args);
|
|
124
|
+
var Constructor = Function.bind.apply(Parent, a);
|
|
125
|
+
var instance = new Constructor();
|
|
126
|
+
if (Class) _set_prototype_of(instance, Class.prototype);
|
|
127
|
+
return instance;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return _construct.apply(null, arguments);
|
|
131
|
+
}
|
|
132
|
+
function _defineProperties(target, props) {
|
|
133
|
+
for(var i = 0; i < props.length; i++){
|
|
134
|
+
var descriptor = props[i];
|
|
135
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
136
|
+
descriptor.configurable = true;
|
|
137
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
138
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
142
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
143
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
144
|
+
return Constructor;
|
|
145
|
+
}
|
|
146
|
+
function _define_property(obj, key, value) {
|
|
147
|
+
if (key in obj) {
|
|
148
|
+
Object.defineProperty(obj, key, {
|
|
149
|
+
value: value,
|
|
150
|
+
enumerable: true,
|
|
151
|
+
configurable: true,
|
|
152
|
+
writable: true
|
|
153
|
+
});
|
|
154
|
+
} else {
|
|
155
|
+
obj[key] = value;
|
|
156
|
+
}
|
|
157
|
+
return obj;
|
|
158
|
+
}
|
|
159
|
+
function _get_prototype_of(o) {
|
|
160
|
+
_get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {
|
|
161
|
+
return o.__proto__ || Object.getPrototypeOf(o);
|
|
162
|
+
};
|
|
163
|
+
return _get_prototype_of(o);
|
|
164
|
+
}
|
|
165
|
+
function _inherits(subClass, superClass) {
|
|
166
|
+
if (typeof superClass !== "function" && superClass !== null) {
|
|
167
|
+
throw new TypeError("Super expression must either be null or a function");
|
|
168
|
+
}
|
|
169
|
+
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
170
|
+
constructor: {
|
|
171
|
+
value: subClass,
|
|
172
|
+
writable: true,
|
|
173
|
+
configurable: true
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
if (superClass) _set_prototype_of(subClass, superClass);
|
|
177
|
+
}
|
|
178
|
+
function _instanceof(left, right) {
|
|
179
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
180
|
+
return !!right[Symbol.hasInstance](left);
|
|
181
|
+
} else {
|
|
182
|
+
return left instanceof right;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function _is_native_function(fn) {
|
|
186
|
+
return Function.toString.call(fn).indexOf("[native code]") !== -1;
|
|
187
|
+
}
|
|
188
|
+
function _iterable_to_array_limit(arr, i) {
|
|
189
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
190
|
+
if (_i == null) return;
|
|
191
|
+
var _arr = [];
|
|
192
|
+
var _n = true;
|
|
193
|
+
var _d = false;
|
|
194
|
+
var _s, _e;
|
|
195
|
+
try {
|
|
196
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
197
|
+
_arr.push(_s.value);
|
|
198
|
+
if (i && _arr.length === i) break;
|
|
199
|
+
}
|
|
200
|
+
} catch (err) {
|
|
201
|
+
_d = true;
|
|
202
|
+
_e = err;
|
|
203
|
+
} finally{
|
|
204
|
+
try {
|
|
205
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
206
|
+
} finally{
|
|
207
|
+
if (_d) throw _e;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return _arr;
|
|
211
|
+
}
|
|
212
|
+
function _non_iterable_rest() {
|
|
213
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
214
|
+
}
|
|
215
|
+
function _object_spread(target) {
|
|
216
|
+
for(var i = 1; i < arguments.length; i++){
|
|
217
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
218
|
+
var ownKeys = Object.keys(source);
|
|
219
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
220
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
221
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
ownKeys.forEach(function(key) {
|
|
225
|
+
_define_property(target, key, source[key]);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return target;
|
|
229
|
+
}
|
|
230
|
+
function _possible_constructor_return(self, call) {
|
|
231
|
+
if (call && (_type_of(call) === "object" || typeof call === "function")) {
|
|
232
|
+
return call;
|
|
233
|
+
}
|
|
234
|
+
return _assert_this_initialized(self);
|
|
235
|
+
}
|
|
236
|
+
function _set_prototype_of(o, p) {
|
|
237
|
+
_set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
|
|
238
|
+
o.__proto__ = p;
|
|
239
|
+
return o;
|
|
240
|
+
};
|
|
241
|
+
return _set_prototype_of(o, p);
|
|
242
|
+
}
|
|
243
|
+
function _sliced_to_array(arr, i) {
|
|
244
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
245
|
+
}
|
|
246
|
+
function _type_of(obj) {
|
|
247
|
+
"@swc/helpers - typeof";
|
|
248
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
249
|
+
}
|
|
250
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
251
|
+
if (!o) return;
|
|
252
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
253
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
254
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
255
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
256
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
257
|
+
}
|
|
258
|
+
function _wrap_native_super(Class) {
|
|
259
|
+
var _cache = typeof Map === "function" ? new Map() : undefined;
|
|
260
|
+
_wrap_native_super = function wrapNativeSuper(Class) {
|
|
261
|
+
if (Class === null || !_is_native_function(Class)) return Class;
|
|
262
|
+
if (typeof Class !== "function") {
|
|
263
|
+
throw new TypeError("Super expression must either be null or a function");
|
|
264
|
+
}
|
|
265
|
+
if (typeof _cache !== "undefined") {
|
|
266
|
+
if (_cache.has(Class)) return _cache.get(Class);
|
|
267
|
+
_cache.set(Class, Wrapper);
|
|
268
|
+
}
|
|
269
|
+
function Wrapper() {
|
|
270
|
+
return _construct(Class, arguments, _get_prototype_of(this).constructor);
|
|
271
|
+
}
|
|
272
|
+
Wrapper.prototype = Object.create(Class.prototype, {
|
|
273
|
+
constructor: {
|
|
274
|
+
value: Wrapper,
|
|
275
|
+
enumerable: false,
|
|
276
|
+
writable: true,
|
|
277
|
+
configurable: true
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
return _set_prototype_of(Wrapper, Class);
|
|
281
|
+
};
|
|
282
|
+
return _wrap_native_super(Class);
|
|
283
|
+
}
|
|
284
|
+
function _is_native_reflect_construct() {
|
|
285
|
+
try {
|
|
286
|
+
var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
|
|
287
|
+
} catch (_) {}
|
|
288
|
+
return (_is_native_reflect_construct = function() {
|
|
289
|
+
return !!result;
|
|
290
|
+
})();
|
|
291
|
+
}
|
|
292
|
+
function _ts_generator(thisArg, body) {
|
|
293
|
+
var f, y, t, _ = {
|
|
294
|
+
label: 0,
|
|
295
|
+
sent: function() {
|
|
296
|
+
if (t[0] & 1) throw t[1];
|
|
297
|
+
return t[1];
|
|
298
|
+
},
|
|
299
|
+
trys: [],
|
|
300
|
+
ops: []
|
|
301
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
302
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
303
|
+
return this;
|
|
304
|
+
}), g;
|
|
305
|
+
function verb(n) {
|
|
306
|
+
return function(v) {
|
|
307
|
+
return step([
|
|
308
|
+
n,
|
|
309
|
+
v
|
|
310
|
+
]);
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function step(op) {
|
|
314
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
315
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
316
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
317
|
+
if (y = 0, t) op = [
|
|
318
|
+
op[0] & 2,
|
|
319
|
+
t.value
|
|
320
|
+
];
|
|
321
|
+
switch(op[0]){
|
|
322
|
+
case 0:
|
|
323
|
+
case 1:
|
|
324
|
+
t = op;
|
|
325
|
+
break;
|
|
326
|
+
case 4:
|
|
327
|
+
_.label++;
|
|
328
|
+
return {
|
|
329
|
+
value: op[1],
|
|
330
|
+
done: false
|
|
331
|
+
};
|
|
332
|
+
case 5:
|
|
333
|
+
_.label++;
|
|
334
|
+
y = op[1];
|
|
335
|
+
op = [
|
|
336
|
+
0
|
|
337
|
+
];
|
|
338
|
+
continue;
|
|
339
|
+
case 7:
|
|
340
|
+
op = _.ops.pop();
|
|
341
|
+
_.trys.pop();
|
|
342
|
+
continue;
|
|
343
|
+
default:
|
|
344
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
345
|
+
_ = 0;
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
349
|
+
_.label = op[1];
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
353
|
+
_.label = t[1];
|
|
354
|
+
t = op;
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
if (t && _.label < t[2]) {
|
|
358
|
+
_.label = t[2];
|
|
359
|
+
_.ops.push(op);
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
if (t[2]) _.ops.pop();
|
|
363
|
+
_.trys.pop();
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
op = body.call(thisArg, _);
|
|
367
|
+
} catch (e) {
|
|
368
|
+
op = [
|
|
369
|
+
6,
|
|
370
|
+
e
|
|
371
|
+
];
|
|
372
|
+
y = 0;
|
|
373
|
+
} finally{
|
|
374
|
+
f = t = 0;
|
|
375
|
+
}
|
|
376
|
+
if (op[0] & 5) throw op[1];
|
|
377
|
+
return {
|
|
378
|
+
value: op[0] ? op[1] : void 0,
|
|
379
|
+
done: true
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function _ts_values(o) {
|
|
384
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
385
|
+
if (m) return m.call(o);
|
|
386
|
+
if (o && typeof o.length === "number") return {
|
|
387
|
+
next: function() {
|
|
388
|
+
if (o && i >= o.length) o = void 0;
|
|
389
|
+
return {
|
|
390
|
+
value: o && o[i++],
|
|
391
|
+
done: !o
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
396
|
+
}
|
|
397
|
+
var HookError = /*#__PURE__*/ function(Error1) {
|
|
398
|
+
"use strict";
|
|
399
|
+
_inherits(HookError, Error1);
|
|
400
|
+
function HookError(message) {
|
|
401
|
+
_class_call_check(this, HookError);
|
|
402
|
+
var _this;
|
|
403
|
+
_this = _call_super(this, HookError, [
|
|
404
|
+
message
|
|
405
|
+
]), /** Name of the hook where the error occurred */ _define_property(_this, "hookName", void 0), /** Extension point where the error occurred: 'before', 'after', or 'error' */ _define_property(_this, "extPoint", void 0), /** Original error if `fail()` was called with an Error instance */ _define_property(_this, "originalError", void 0), /** Whether the hook was explicitly aborted via `fail()` */ _define_property(_this, "aborted", false);
|
|
406
|
+
return _this;
|
|
407
|
+
}
|
|
408
|
+
return HookError;
|
|
409
|
+
}(_wrap_native_super(Error));
|
|
410
|
+
var isHookError = function(error) {
|
|
411
|
+
var _error_constructor;
|
|
412
|
+
return (error === null || error === void 0 ? void 0 : (_error_constructor = error.constructor) === null || _error_constructor === void 0 ? void 0 : _error_constructor.name) === HookError.name;
|
|
413
|
+
};
|
|
414
|
+
var Hook = function Hook() {
|
|
415
|
+
"use strict";
|
|
416
|
+
_class_call_check(this, Hook);
|
|
417
|
+
_define_property(this, "before", new Set());
|
|
418
|
+
_define_property(this, "after", new Set());
|
|
419
|
+
_define_property(this, "error", new Set());
|
|
420
|
+
};
|
|
421
|
+
var allowedExtPoints = new Set([
|
|
422
|
+
'before',
|
|
423
|
+
'after',
|
|
424
|
+
'error'
|
|
425
|
+
]);
|
|
426
|
+
var _registered = /*#__PURE__*/ new WeakMap(), _hooks = /*#__PURE__*/ new WeakMap(), _hookFnOpts = /*#__PURE__*/ new WeakMap(), _wrapped = /*#__PURE__*/ new WeakMap();
|
|
427
|
+
var HookEngine = /*#__PURE__*/ function() {
|
|
428
|
+
"use strict";
|
|
429
|
+
function HookEngine() {
|
|
430
|
+
_class_call_check(this, HookEngine);
|
|
431
|
+
_class_private_field_init(this, _registered, {
|
|
432
|
+
writable: true,
|
|
433
|
+
value: new Set()
|
|
434
|
+
});
|
|
435
|
+
_class_private_field_init(this, _hooks, {
|
|
436
|
+
writable: true,
|
|
437
|
+
value: new Map()
|
|
438
|
+
});
|
|
439
|
+
_class_private_field_init(this, _hookFnOpts, {
|
|
440
|
+
writable: true,
|
|
441
|
+
value: new WeakMap()
|
|
442
|
+
});
|
|
443
|
+
_class_private_field_init(this, _wrapped, {
|
|
444
|
+
writable: true,
|
|
445
|
+
value: new WeakMap()
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
_create_class(HookEngine, [
|
|
449
|
+
{
|
|
450
|
+
/**
|
|
451
|
+
* Add an extension to a registered hook.
|
|
452
|
+
*
|
|
453
|
+
* Extensions run at specific points in the hook lifecycle:
|
|
454
|
+
* - `before`: Runs before the original function. Can modify args or return early.
|
|
455
|
+
* - `after`: Runs after successful execution. Can modify the result.
|
|
456
|
+
* - `error`: Runs when the original function throws. Can handle or transform errors.
|
|
457
|
+
*
|
|
458
|
+
* @param name - Name of the registered hook to extend
|
|
459
|
+
* @param extensionPoint - When to run: 'before', 'after', or 'error'
|
|
460
|
+
* @param cbOrOpts - Extension callback or options object
|
|
461
|
+
* @returns Cleanup function to remove the extension
|
|
462
|
+
*
|
|
463
|
+
* @example
|
|
464
|
+
* // Simple callback
|
|
465
|
+
* const cleanup = hooks.extend('save', 'before', async (ctx) => {
|
|
466
|
+
* console.log('About to save:', ctx.args);
|
|
467
|
+
* });
|
|
468
|
+
*
|
|
469
|
+
* // With options
|
|
470
|
+
* hooks.extend('save', 'after', {
|
|
471
|
+
* callback: async (ctx) => { console.log('Saved!'); },
|
|
472
|
+
* once: true, // Remove after first run
|
|
473
|
+
* ignoreOnFail: true // Don't throw if this extension fails
|
|
474
|
+
* });
|
|
475
|
+
*
|
|
476
|
+
* // Later: remove the extension
|
|
477
|
+
* cleanup();
|
|
478
|
+
*/ key: "extend",
|
|
479
|
+
value: function extend(name, extensionPoint, cbOrOpts) {
|
|
480
|
+
var callback = typeof cbOrOpts === 'function' ? cbOrOpts : cbOrOpts === null || cbOrOpts === void 0 ? void 0 : cbOrOpts.callback;
|
|
481
|
+
var opts = typeof cbOrOpts === 'function' ? {} : cbOrOpts;
|
|
482
|
+
(0, _utils.assert)(typeof name === 'string', '"name" must be a string');
|
|
483
|
+
(0, _utils.assert)(_class_private_field_get(this, _registered).has(name), "'".concat(name.toString(), "' is not a registered hook"));
|
|
484
|
+
(0, _utils.assert)(typeof extensionPoint === 'string', '"extensionPoint" must be a string');
|
|
485
|
+
(0, _utils.assert)(allowedExtPoints.has(extensionPoint), "'".concat(extensionPoint, "' is not a valid extension point"));
|
|
486
|
+
(0, _utils.assert)((0, _utils.isFunction)(callback) || (0, _utils.isObject)(cbOrOpts), '"cbOrOpts" must be a extension callback or options');
|
|
487
|
+
(0, _utils.assert)((0, _utils.isFunction)(callback), 'callback must be a function');
|
|
488
|
+
var _class_private_field_get_get;
|
|
489
|
+
var hook = (_class_private_field_get_get = _class_private_field_get(this, _hooks).get(name)) !== null && _class_private_field_get_get !== void 0 ? _class_private_field_get_get : new Hook();
|
|
490
|
+
hook[extensionPoint].add(callback);
|
|
491
|
+
_class_private_field_get(this, _hooks).set(name, hook);
|
|
492
|
+
_class_private_field_get(this, _hookFnOpts).set(callback, opts);
|
|
493
|
+
/**
|
|
494
|
+
* Removes the registered hook extension
|
|
495
|
+
*/ return function() {
|
|
496
|
+
hook[extensionPoint].delete(callback);
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
/**
|
|
502
|
+
* Register a function as a hookable and return the wrapped version.
|
|
503
|
+
*
|
|
504
|
+
* The wrapped function behaves identically to the original but allows
|
|
505
|
+
* extensions to be added via `extend()`. Use `wrap()` for a simpler API
|
|
506
|
+
* when working with object methods.
|
|
507
|
+
*
|
|
508
|
+
* @param name - Unique name for this hook (must match a key in Shape)
|
|
509
|
+
* @param cb - The original function to wrap
|
|
510
|
+
* @param opts - Options for the wrapped function
|
|
511
|
+
* @returns Wrapped function with hook support
|
|
512
|
+
*
|
|
513
|
+
* @example
|
|
514
|
+
* const hooks = new HookEngine<{ fetch: typeof fetch }>();
|
|
515
|
+
*
|
|
516
|
+
* const hookedFetch = hooks.make('fetch', fetch);
|
|
517
|
+
*
|
|
518
|
+
* hooks.extend('fetch', 'before', async (ctx) => {
|
|
519
|
+
* console.log('Fetching:', ctx.args[0]);
|
|
520
|
+
* });
|
|
521
|
+
*
|
|
522
|
+
* await hookedFetch('/api/data');
|
|
523
|
+
*/ key: "make",
|
|
524
|
+
value: function make(name, cb) {
|
|
525
|
+
var opts = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
526
|
+
var _this = this;
|
|
527
|
+
(0, _utils.assert)(typeof name === 'string', '"name" must be a string');
|
|
528
|
+
(0, _utils.assert)(!_class_private_field_get(this, _registered).has(name), "'".concat(name.toString(), "' hook is already registered"));
|
|
529
|
+
(0, _utils.assert)((0, _utils.isFunction)(cb), '"cb" must be a function');
|
|
530
|
+
(0, _utils.assert)((0, _utils.isObject)(opts), '"opts" must be an object');
|
|
531
|
+
_class_private_field_get(this, _registered).add(name);
|
|
532
|
+
if (_class_private_field_get(this, _wrapped).has(cb)) {
|
|
533
|
+
return _class_private_field_get(this, _wrapped).get(cb);
|
|
534
|
+
}
|
|
535
|
+
var callback = function() {
|
|
536
|
+
for(var _len = arguments.length, origArgs = new Array(_len), _key = 0; _key < _len; _key++){
|
|
537
|
+
origArgs[_key] = arguments[_key];
|
|
538
|
+
}
|
|
539
|
+
return _async_to_generator(function() {
|
|
540
|
+
var _this, returnEarly, hook, context, _ref, before, after, errorFns, handleSet, _ref1, res, err;
|
|
541
|
+
return _ts_generator(this, function(_state) {
|
|
542
|
+
switch(_state.label){
|
|
543
|
+
case 0:
|
|
544
|
+
_this = this;
|
|
545
|
+
returnEarly = false;
|
|
546
|
+
hook = _class_private_field_get(this, _hooks).get(name);
|
|
547
|
+
context = {
|
|
548
|
+
args: origArgs,
|
|
549
|
+
point: 'before',
|
|
550
|
+
removeHook: function removeHook() {},
|
|
551
|
+
returnEarly: function returnEarly1() {
|
|
552
|
+
returnEarly = true;
|
|
553
|
+
},
|
|
554
|
+
setArgs: function setArgs(next) {
|
|
555
|
+
(0, _utils.assert)(Array.isArray(next), "setArgs: next args for '".concat(context.point, "' '").concat(name.toString(), "' must be an array of arguments"));
|
|
556
|
+
context.args = next;
|
|
557
|
+
},
|
|
558
|
+
setResult: function setResult(next) {
|
|
559
|
+
context.results = next;
|
|
560
|
+
},
|
|
561
|
+
fail: function fail(reason) {
|
|
562
|
+
var error = new HookError("Hook Aborted: ".concat(reason !== null && reason !== void 0 ? reason : 'unknown'));
|
|
563
|
+
if (_instanceof(reason, Error)) {
|
|
564
|
+
error.originalError = reason;
|
|
565
|
+
}
|
|
566
|
+
error.extPoint = context.point;
|
|
567
|
+
error.hookName = name;
|
|
568
|
+
throw error;
|
|
569
|
+
}
|
|
570
|
+
};
|
|
571
|
+
_ref = hook !== null && hook !== void 0 ? hook : new Hook(), before = _ref.before, after = _ref.after, errorFns = _ref.error;
|
|
572
|
+
handleSet = function(which, point) {
|
|
573
|
+
return _async_to_generator(function() {
|
|
574
|
+
var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _this, _loop, _iterator, _step, _ret, err;
|
|
575
|
+
return _ts_generator(this, function(_state) {
|
|
576
|
+
switch(_state.label){
|
|
577
|
+
case 0:
|
|
578
|
+
context.point = point;
|
|
579
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
580
|
+
_state.label = 1;
|
|
581
|
+
case 1:
|
|
582
|
+
_state.trys.push([
|
|
583
|
+
1,
|
|
584
|
+
6,
|
|
585
|
+
7,
|
|
586
|
+
8
|
|
587
|
+
]);
|
|
588
|
+
_loop = function() {
|
|
589
|
+
var fn, opts, _ref, _$err;
|
|
590
|
+
return _ts_generator(this, function(_state) {
|
|
591
|
+
switch(_state.label){
|
|
592
|
+
case 0:
|
|
593
|
+
fn = _step.value;
|
|
594
|
+
context.removeHook = function() {
|
|
595
|
+
return which.delete(fn);
|
|
596
|
+
};
|
|
597
|
+
opts = _class_private_field_get(_this, _hookFnOpts).get(fn);
|
|
598
|
+
return [
|
|
599
|
+
4,
|
|
600
|
+
(0, _utils.attempt)(function() {
|
|
601
|
+
return fn(_object_spread({}, context));
|
|
602
|
+
})
|
|
603
|
+
];
|
|
604
|
+
case 1:
|
|
605
|
+
_ref = _sliced_to_array.apply(void 0, [
|
|
606
|
+
_state.sent(),
|
|
607
|
+
2
|
|
608
|
+
]), _$err = _ref[1];
|
|
609
|
+
if (opts.once) context.removeHook();
|
|
610
|
+
if (_$err && opts.ignoreOnFail !== true) {
|
|
611
|
+
throw _$err;
|
|
612
|
+
}
|
|
613
|
+
if (returnEarly) return [
|
|
614
|
+
2,
|
|
615
|
+
"break"
|
|
616
|
+
];
|
|
617
|
+
return [
|
|
618
|
+
2
|
|
619
|
+
];
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
};
|
|
623
|
+
_iterator = which[Symbol.iterator]();
|
|
624
|
+
_state.label = 2;
|
|
625
|
+
case 2:
|
|
626
|
+
if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
|
|
627
|
+
3,
|
|
628
|
+
5
|
|
629
|
+
];
|
|
630
|
+
_this = this;
|
|
631
|
+
return [
|
|
632
|
+
5,
|
|
633
|
+
_ts_values(_loop())
|
|
634
|
+
];
|
|
635
|
+
case 3:
|
|
636
|
+
_ret = _state.sent();
|
|
637
|
+
if (_ret === "break") return [
|
|
638
|
+
3,
|
|
639
|
+
5
|
|
640
|
+
];
|
|
641
|
+
_state.label = 4;
|
|
642
|
+
case 4:
|
|
643
|
+
_iteratorNormalCompletion = true;
|
|
644
|
+
return [
|
|
645
|
+
3,
|
|
646
|
+
2
|
|
647
|
+
];
|
|
648
|
+
case 5:
|
|
649
|
+
return [
|
|
650
|
+
3,
|
|
651
|
+
8
|
|
652
|
+
];
|
|
653
|
+
case 6:
|
|
654
|
+
err = _state.sent();
|
|
655
|
+
_didIteratorError = true;
|
|
656
|
+
_iteratorError = err;
|
|
657
|
+
return [
|
|
658
|
+
3,
|
|
659
|
+
8
|
|
660
|
+
];
|
|
661
|
+
case 7:
|
|
662
|
+
try {
|
|
663
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
664
|
+
_iterator.return();
|
|
665
|
+
}
|
|
666
|
+
} finally{
|
|
667
|
+
if (_didIteratorError) {
|
|
668
|
+
throw _iteratorError;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
return [
|
|
672
|
+
7
|
|
673
|
+
];
|
|
674
|
+
case 8:
|
|
675
|
+
return [
|
|
676
|
+
2
|
|
677
|
+
];
|
|
678
|
+
}
|
|
679
|
+
});
|
|
680
|
+
}).call(_this);
|
|
681
|
+
};
|
|
682
|
+
return [
|
|
683
|
+
4,
|
|
684
|
+
handleSet(before, 'before')
|
|
685
|
+
];
|
|
686
|
+
case 1:
|
|
687
|
+
_state.sent();
|
|
688
|
+
if (returnEarly) return [
|
|
689
|
+
2,
|
|
690
|
+
context.results
|
|
691
|
+
];
|
|
692
|
+
return [
|
|
693
|
+
4,
|
|
694
|
+
(0, _utils.attempt)(function() {
|
|
695
|
+
return cb.apply((opts === null || opts === void 0 ? void 0 : opts.bindTo) || cb, context.args);
|
|
696
|
+
})
|
|
697
|
+
];
|
|
698
|
+
case 2:
|
|
699
|
+
_ref1 = _sliced_to_array.apply(void 0, [
|
|
700
|
+
_state.sent(),
|
|
701
|
+
2
|
|
702
|
+
]), res = _ref1[0], err = _ref1[1];
|
|
703
|
+
context.results = res;
|
|
704
|
+
context.error = err;
|
|
705
|
+
if (!err) return [
|
|
706
|
+
3,
|
|
707
|
+
4
|
|
708
|
+
];
|
|
709
|
+
context.point = 'error';
|
|
710
|
+
return [
|
|
711
|
+
4,
|
|
712
|
+
handleSet(errorFns, 'error')
|
|
713
|
+
];
|
|
714
|
+
case 3:
|
|
715
|
+
_state.sent();
|
|
716
|
+
throw err;
|
|
717
|
+
case 4:
|
|
718
|
+
return [
|
|
719
|
+
4,
|
|
720
|
+
handleSet(after, 'after')
|
|
721
|
+
];
|
|
722
|
+
case 5:
|
|
723
|
+
_state.sent();
|
|
724
|
+
return [
|
|
725
|
+
2,
|
|
726
|
+
context.results
|
|
727
|
+
];
|
|
728
|
+
}
|
|
729
|
+
});
|
|
730
|
+
}).call(_this);
|
|
731
|
+
};
|
|
732
|
+
return callback;
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
/**
|
|
737
|
+
* Wrap an object method in-place to make it hookable.
|
|
738
|
+
*
|
|
739
|
+
* This is a convenience method that combines `make()` with automatic
|
|
740
|
+
* binding and reassignment. The method is replaced on the instance
|
|
741
|
+
* with the wrapped version.
|
|
742
|
+
*
|
|
743
|
+
* @param instance - Object containing the method to wrap
|
|
744
|
+
* @param name - Name of the method to wrap
|
|
745
|
+
* @param opts - Additional options
|
|
746
|
+
*
|
|
747
|
+
* @example
|
|
748
|
+
* class UserService {
|
|
749
|
+
* async save(user: User) { ... }
|
|
750
|
+
* }
|
|
751
|
+
*
|
|
752
|
+
* const service = new UserService();
|
|
753
|
+
* const hooks = new HookEngine<UserService>();
|
|
754
|
+
*
|
|
755
|
+
* hooks.wrap(service, 'save');
|
|
756
|
+
*
|
|
757
|
+
* // Now service.save() is hookable
|
|
758
|
+
* hooks.extend('save', 'before', async (ctx) => {
|
|
759
|
+
* console.log('Saving user:', ctx.args[0]);
|
|
760
|
+
* });
|
|
761
|
+
*/ key: "wrap",
|
|
762
|
+
value: function wrap(instance, name, opts) {
|
|
763
|
+
(0, _utils.assert)((0, _utils.isObject)(instance), '"instance" must be an object');
|
|
764
|
+
var wrapped = this.make(name, instance[name], _object_spread({
|
|
765
|
+
bindTo: instance
|
|
766
|
+
}, opts));
|
|
767
|
+
_class_private_field_get(this, _wrapped).set(wrapped, instance[name]);
|
|
768
|
+
instance[name] = wrapped;
|
|
769
|
+
}
|
|
770
|
+
},
|
|
771
|
+
{
|
|
772
|
+
/**
|
|
773
|
+
* Clear all registered hooks and extensions.
|
|
774
|
+
*
|
|
775
|
+
* After calling this method, all hooks are unregistered and all
|
|
776
|
+
* extensions are removed. Previously wrapped functions will continue
|
|
777
|
+
* to work but without any extensions.
|
|
778
|
+
*
|
|
779
|
+
* @example
|
|
780
|
+
* hooks.wrap(app, 'save');
|
|
781
|
+
* hooks.extend('save', 'before', validator);
|
|
782
|
+
*
|
|
783
|
+
* // Reset for testing
|
|
784
|
+
* hooks.clear();
|
|
785
|
+
*
|
|
786
|
+
* // app.save() still works, but validator no longer runs
|
|
787
|
+
*/ key: "clear",
|
|
788
|
+
value: function clear() {
|
|
789
|
+
_class_private_field_get(this, _registered).clear();
|
|
790
|
+
_class_private_field_get(this, _hooks).clear();
|
|
791
|
+
_class_private_field_set(this, _hookFnOpts, new WeakMap());
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
]);
|
|
795
|
+
return HookEngine;
|
|
796
|
+
}();
|