-
Notifications
You must be signed in to change notification settings - Fork 0
/
beforefn.js
71 lines (55 loc) · 1.96 KB
/
beforefn.js
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
"use strict";
module.exports = beforeQueue;
// inherit is pretty slow
module.exports.inherit = function beforeInherit(fn, beforeFn, overrideContext) {
var before = beforeQueue(fn, beforeFn, overrideContext);
before.__proto__ = fn;
before.prototype = fn.prototype;
return before;
};
function beforeQueue(fn, beforeFn, overrideContext) {
if (overrideContext) beforeFn.__context = overrideContext;
if (fn.__beforeFns) {
fn.__beforeFns.push(beforeFn);
return fn;
}
before.__beforeFns = [beforeFn];
function before() {
var self = this;
var fns = before.__beforeFns;
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var fnArgs = args;
var fnContext = undefined;
// for loop because performance
for (var i = 0; i < fns.length; i++) {
var doBefore = fns[i];
var _args = fnArgs;
var context = self;
if (fnContext) context = fnContext;else if (doBefore.__context) context = doBefore.__context;
var oldArgs = doBefore.args;
var oldContext = doBefore.context;
var oldFn = doBefore.fn;
// execution information is stored on doBefore function itself
doBefore.args = _args;
doBefore.fn = fn;
doBefore.context = context;
doBefore.apply(doBefore.context, doBefore.args);
// extract args/context which may have changed during execution of doBefore
if (doBefore.args !== _args) {
fnArgs = doBefore.args;
if (!Array.isArray(fnArgs)) fnArgs = Array.from(fnArgs || []);
}
// if we have a new context
fnContext = doBefore.context !== context ? doBefore.context : undefined;
// for good measure remove properties we added on doBefore
doBefore.args = oldArgs;
doBefore.fn = oldFn;
doBefore.context = oldContext;
}
var finalContext = fnContext ? fnContext : self;
return fn.apply(finalContext, fnArgs);
}
return before;
}