1 |
|
2 | var oldProxy = Proxy;
|
3 |
|
4 | global['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 |
|
18 | export 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 | }
|