@@ -48,9 +48,8 @@ export function _createResolver(scopes, prefixes = ['']) {
4848 * @private
4949 */
5050export 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