UNPKG

3.77 kBPlain TextView Raw
1
2var oldProxy = Proxy;
3
4global['Proxy'] = new oldProxy(oldProxy, {
5 get: function (target, key)
6 {
7 if (typeof (key) == 'symbol' && key == Symbol.hasInstance)
8 {
9 return function (o)
10 {
11 return o && o[Symbol.for('isProxy')];
12 }
13 }
14 return Reflect.get(target, key);
15 }
16});
17
18export function chain<T extends Function>(target: T, keyHandler: (keys: string[], ...args) => any[])
19{
20 var configProxyGetter = {
21 get: function chain(target: T, key)
22 {
23 var keys: string[] = [];
24 if (typeof (key) == 'symbol')
25 {
26 switch (key.toString())
27 {
28 case 'Symbol(util.inspect.custom)':
29 return () => target;
30 case 'Symbol(Symbol.toPrimitive)':
31 return target[Symbol.toPrimitive];
32 case 'Symbol(isProxy)':
33 return true;
34 default:
35 throw new Error('Not supported');
36 }
37 }
38 switch (key)
39 {
40 case 'then':
41 let c = target();
42 return c.then.bind(c);
43 case 'apply':
44 return target.apply;
45 case 'length':
46 return target.length;
47 case 'toString':
48 return target.toString.bind(target);
49 default:
50 keys.push(key);
51 let proxy = new Proxy(function (...args)
52 {
53 if (!args)
54 args = [];
55 args.unshift(keys);
56 return target.apply(this, keyHandler.apply(this, args));
57 }, {
58 get: function (getConfig, subKey)
59 {
60 if (typeof (subKey) == 'symbol')
61 {
62 switch (subKey.toString())
63 {
64 case 'Symbol(util.inspect.custom)':
65 return () => target;
66 case 'Symbol(Symbol.toPrimitive)':
67 return target[Symbol.toPrimitive];
68 case 'Symbol(isProxy)':
69 return true;
70 default:
71 throw new Error('Not supported');
72 }
73 }
74 switch (subKey)
75 {
76 case 'then':
77 let c = target.apply(this, keyHandler(keys));
78 return c.then.bind(c);
79 case 'apply':
80 return getConfig.apply;
81 case 'length':
82 return target.length;
83 case 'toString':
84 return target.toString.bind(target);
85 }
86 if (subKey)
87 keys.push(subKey.toString());
88 return proxy;
89 }
90 });
91 return proxy;
92 }
93 }
94 };
95 return new Proxy(target, configProxyGetter);
96}