]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Fix set/delete oprations on Proxies (#8506)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Tue, 23 Feb 2021 17:46:31 +0000 (19:46 +0200)
committerGitHub <noreply@github.com>
Tue, 23 Feb 2021 17:46:31 +0000 (19:46 +0200)
src/helpers/helpers.config.js
test/specs/helpers.config.tests.js

index fb60c81c42b335803720fa6b63eb89721daf9312..7fd5674ada9d736eda0ae5b56a18c74764840ef7 100644 (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;
     }
   });
 }
index 86bee170e7cd0f3d5412efecdf2c1571566f8249..e9a22a1377e7c6ee4afdf845bccfd379db16b2c6 100644 (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() {