Skip to content

Commit 87d9d9a

Browse files
committed
_attachContext
1 parent 1651f73 commit 87d9d9a

File tree

1 file changed

+40
-34
lines changed

1 file changed

+40
-34
lines changed

src/helpers/helpers.config.js

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@ export function _createResolver(scopes, prefixes = ['']) {
4848
* @private
4949
*/
5050
export function _attachContext(proxy, context, subProxy) {
51-
const cache = {};
51+
const cache = {_proxy: proxy, _context: context, _subProxy: subProxy, _stack: new Set()};
5252
const {isScriptable, isIndexable} = _descriptors(proxy);
53-
const stack = new Set();
5453
return new Proxy(cache, {
5554
// eslint-disable-next-line complexity
5655
get(target, prop, receiver) {
@@ -62,31 +61,10 @@ export function _attachContext(proxy, context, subProxy) {
6261

6362
if (isPublicOptionValue(prop, value)) {
6463
if (isFunction(value) && isScriptable(prop)) {
65-
if (stack.has(prop)) {
66-
// @ts-ignore
67-
throw new Error('Recursion detected: ' + [...stack].join('->') + '->' + prop);
68-
}
69-
stack.add(prop);
70-
value = value(context, subProxy || receiver);
71-
stack.delete(prop);
72-
if (isObject(value)) {
73-
// When scriptable option returns an object, create a resolver on that.
74-
value = createSubResolver([value].concat(proxy._scopes), prop, value); // _createResolver([value].concat(subscopes(proxy._scopes, prop)));
75-
}
64+
value = _resolveScriptable(prop, value, target, receiver);
7665
}
7766
if (isArray(value) && value.length) {
78-
if (defined(context.index) && isIndexable(prop)) {
79-
value = value[context.index % value.length];
80-
} else if (isObject(value[0])) {
81-
// Array of objects, return array or resolvers
82-
const arr = value;
83-
const scopes = proxy._scopes.filter(s => s !== arr);
84-
value = [];
85-
for (const item of arr) {
86-
const resolver = createSubResolver([item].concat(scopes), prop, item);
87-
value.push(_attachContext(resolver, context, subProxy && subProxy[prop]));
88-
}
89-
}
67+
value = _resolveArray(prop, value, target, isIndexable);
9068
}
9169
if (defined(value)) {
9270
if (needsSubResolver(prop, value)) {
@@ -99,22 +77,50 @@ export function _attachContext(proxy, context, subProxy) {
9977
return value;
10078
},
10179

102-
ownKeys() {
103-
return Reflect.ownKeys(proxy);
104-
},
105-
106-
getOwnPropertyDescriptor(target, prop) {
107-
return Reflect.getOwnPropertyDescriptor(proxy._scopes[0], prop);
108-
},
80+
ownKeys: () => Reflect.ownKeys(proxy),
81+
getOwnPropertyDescriptor: (target, prop) => Reflect.getOwnPropertyDescriptor(proxy._scopes[0], prop),
10982

11083
set(target, prop, value) {
111-
delete target[prop];
11284
proxy[prop] = value;
113-
return true;
85+
return delete target[prop];
11486
}
11587
});
11688
}
11789

90+
function _resolveScriptable(prop, value, target, receiver) {
91+
const {_proxy, _context, _subProxy, _stack} = target;
92+
if (_stack.has(prop)) {
93+
// @ts-ignore
94+
throw new Error('Recursion detected: ' + [..._stack].join('->') + '->' + prop);
95+
}
96+
_stack.add(prop);
97+
value = value(_context, _subProxy || receiver);
98+
_stack.delete(prop);
99+
if (isObject(value)) {
100+
// When scriptable option returns an object, create a resolver on that.
101+
value = createSubResolver([value].concat(_proxy._scopes), prop, value);
102+
}
103+
return value;
104+
}
105+
106+
function _resolveArray(prop, value, target, isIndexable) {
107+
const {_proxy, _context, _subProxy} = target;
108+
109+
if (defined(_context.index) && isIndexable(prop)) {
110+
value = value[_context.index % value.length];
111+
} else if (isObject(value[0])) {
112+
// Array of objects, return array or resolvers
113+
const arr = value;
114+
const scopes = _proxy._scopes.filter(s => s !== arr);
115+
value = [];
116+
for (const item of arr) {
117+
const resolver = createSubResolver([item].concat(scopes), prop, item);
118+
value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop]));
119+
}
120+
}
121+
return value;
122+
}
123+
118124
/**
119125
* @private
120126
*/

0 commit comments

Comments
 (0)