Fix set/delete oprations on Proxies (#8506)

This commit is contained in:
Jukka Kurkela 2021-02-23 19:46:31 +02:00 committed by GitHub
parent e55a12ce87
commit 639c34f89e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 4 deletions

View File

@ -22,6 +22,16 @@ export function _createResolver(scopes, prefixes = [''], rootScopes = scopes, fa
override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),
};
return new Proxy(cache, {
/**
* A trap for the delete operator.
*/
deleteProperty(target, prop) {
delete target[prop]; // remove from cache
delete target._keys; // remove cached keys
delete scopes[0][prop]; // remove from top level scope
return true;
},
/**
* A trap for getting property values.
*/
@ -63,8 +73,10 @@ export function _createResolver(scopes, prefixes = [''], rootScopes = scopes, fa
* A trap for setting property values.
*/
set(target, prop, value) {
scopes[0][prop] = value;
return delete target[prop];
scopes[0][prop] = value; // set to top level scope
delete target[prop]; // remove from cache
delete target._keys; // remove cached keys
return true;
}
});
}
@ -89,6 +101,15 @@ export function _attachContext(proxy, context, subProxy, descriptorDefaults) {
override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)
};
return new Proxy(cache, {
/**
* A trap for the delete operator.
*/
deleteProperty(target, prop) {
delete target[prop]; // remove from cache
delete proxy[prop]; // remove from proxy
return true;
},
/**
* A trap for getting property values.
*/
@ -130,8 +151,9 @@ export function _attachContext(proxy, context, subProxy, descriptorDefaults) {
* A trap for setting property values.
*/
set(target, prop, value) {
proxy[prop] = value;
return delete target[prop];
proxy[prop] = value; // set to proxy
delete target[prop]; // remove from cache
return true;
}
});
}

View File

@ -637,6 +637,23 @@ describe('Chart.helpers.config', function() {
expect(opts instanceof Options).toBeTrue();
expect(opts.getter).toEqual('options getter');
expect('test' in opts).toBeFalse();
expect(opts.test).toBeUndefined();
opts.test = true;
expect('test' in opts).toBeTrue();
expect(opts.test).toBeTrue();
delete opts.test;
expect('test' in opts).toBeFalse();
opts.test = (ctx) => ctx.index;
expect('test' in opts).toBeTrue();
expect(opts.test).toBe(1);
delete opts.test;
expect('test' in opts).toBeFalse();
});
describe('_indexable and _scriptable', function() {