]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Add _allKeys descriptor for Object.keys behavior (#8553)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Mon, 1 Mar 2021 21:44:14 +0000 (23:44 +0200)
committerGitHub <noreply@github.com>
Mon, 1 Mar 2021 21:44:14 +0000 (16:44 -0500)
src/core/core.config.js
src/core/core.plugins.js
src/helpers/helpers.config.js
test/specs/core.plugin.tests.js

index 32b70dded58b84e6a034128361561bf35beef6ea..d41240c685add0558b626e15c734092957cbaf40 100644 (file)
@@ -316,7 +316,7 @@ export default class Config {
    * @param {object[]} scopes
    * @param {object} [context]
    * @param {string[]} [prefixes]
-   * @param {{scriptable: boolean, indexable: boolean}} [descriptorDefaults]
+   * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]
    */
   createResolver(scopes, context, prefixes = [''], descriptorDefaults) {
     const {resolver} = getResolver(this._resolverCache, scopes, prefixes);
index 62cb543bc4bbc1dde4d00af875119f508f61cdaa..c4c6da25c2869c1fbd4bb87c17eaca00c39eeee1 100644 (file)
@@ -166,5 +166,5 @@ function createDescriptors(chart, plugins, options, all) {
 function pluginOpts(config, plugin, opts, context) {
   const keys = config.pluginScopeKeys(plugin);
   const scopes = config.getOptionScopes(opts, keys);
-  return config.createResolver(scopes, context, [''], {scriptable: false, indexable: false});
+  return config.createResolver(scopes, context, [''], {scriptable: false, indexable: false, allKeys: true});
 }
index ad005bff176ba8569c84fde63bdc811ab3f3a7c7..0b66682d0c44ad870c84be9ee2b52133146d68e4 100644 (file)
@@ -86,7 +86,7 @@ export function _createResolver(scopes, prefixes = [''], rootScopes = scopes, fa
  * @param {object} proxy - The Proxy returned by `_createResolver`
  * @param {object} context - Context object for scriptable/indexable options
  * @param {object} [subProxy] - The proxy provided for scriptable options
- * @param {{scriptable: boolean, indexable: boolean}} [descriptorDefaults] - Defaults for descriptors
+ * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults] - Defaults for descriptors
  * @private
  */
 export function _attachContext(proxy, context, subProxy, descriptorDefaults) {
@@ -123,7 +123,9 @@ export function _attachContext(proxy, context, subProxy, descriptorDefaults) {
      * Also used by Object.hasOwnProperty.
      */
     getOwnPropertyDescriptor(target, prop) {
-      return Reflect.getOwnPropertyDescriptor(proxy, prop);
+      return target._descriptors.allKeys
+        ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined
+        : Reflect.getOwnPropertyDescriptor(proxy, prop);
     },
 
     /**
@@ -162,8 +164,9 @@ export function _attachContext(proxy, context, subProxy, descriptorDefaults) {
  * @private
  */
 export function _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {
-  const {_scriptable = defaults.scriptable, _indexable = defaults.indexable} = proxy;
+  const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;
   return {
+    allKeys: _allKeys,
     scriptable: _scriptable,
     indexable: _indexable,
     isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,
index 7168ce928ba7dc9029296bd3ac061d14cab82d73..b699a87754ccd8a215fb4f1ed6656f96124bb194 100644 (file)
@@ -274,7 +274,8 @@ describe('Chart.plugins', function() {
       chart.notifyPlugins('hook');
 
       expect(plugin.hook).toHaveBeenCalled();
-      expect(plugin.hook.calls.first().args[2]).toEqualOptions({a: 42});
+      expect(Object.keys(plugin.hook.calls.first().args[2])).toEqual(['a']);
+      expect(plugin.hook.calls.first().args[2]).toEqual(jasmine.objectContaining({a: 42}));
 
       Chart.unregister(plugin);
     });