From 7157a3e7ea42752a33cca955a18c58baaef17f44 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Tue, 31 Jan 2023 10:56:01 +0100 Subject: [PATCH] Enable change of prefixes to existing options proxy --- src/helpers/helpers.config.js | 13 ++++++++----- test/specs/helpers.config.tests.js | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/helpers/helpers.config.js b/src/helpers/helpers.config.js index 3820c5ce325..c1f9e6ca988 100644 --- a/src/helpers/helpers.config.js +++ b/src/helpers/helpers.config.js @@ -22,6 +22,7 @@ export function _createResolver(scopes, prefixes = [''], rootScopes = scopes, fa _fallback: fallback, _getTarget: getTarget, override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback), + overridePrefixes: (pref) => _createResolver(scopes, pref, rootScopes, fallback) }; return new Proxy(cache, { /** @@ -83,6 +84,8 @@ export function _createResolver(scopes, prefixes = [''], rootScopes = scopes, fa }); } +const applyPrefixes = (proxy, prefixes) => prefixes && prefixes.length ? proxy.overridePrefixes(prefixes) : proxy; + /** * Returns an Proxy for resolving option values with context. * @param {object} proxy - The Proxy returned by `_createResolver` @@ -99,8 +102,8 @@ export function _attachContext(proxy, context, subProxy, descriptorDefaults) { _subProxy: subProxy, _stack: new Set(), _descriptors: _descriptors(proxy, descriptorDefaults), - setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults), - override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults) + setContext: (ctx, prefixes) => _attachContext(applyPrefixes(proxy, prefixes), ctx, subProxy, descriptorDefaults), + override: (scope, prefixes) => _attachContext(applyPrefixes(proxy.override(scope), prefixes), context, subProxy, descriptorDefaults) }; return new Proxy(cache, { /** @@ -270,7 +273,7 @@ function addScopes(set, parentScopes, key, parentFallback, value) { return false; } -function createSubResolver(parentScopes, resolver, prop, value) { +function createSubResolver(parentScopes, resolver, prop, value, prefixes = ['']) { const rootScopes = resolver._rootScopes; const fallback = resolveFallback(resolver._fallback, prop, value); const allScopes = [...parentScopes, ...rootScopes]; @@ -286,7 +289,7 @@ function createSubResolver(parentScopes, resolver, prop, value) { return false; } } - return _createResolver(Array.from(set), [''], rootScopes, fallback, + return _createResolver(Array.from(set), prefixes, rootScopes, fallback, () => subGetTarget(resolver, prop, value)); } @@ -316,7 +319,7 @@ function _resolveWithPrefixes(prop, prefixes, scopes, proxy) { value = _resolve(readKey(prefix, prop), scopes); if (defined(value)) { return needsSubResolver(prop, value) - ? createSubResolver(scopes, proxy, prop, value) + ? createSubResolver(scopes, proxy, prop, value, prefixes) : value; } } diff --git a/test/specs/helpers.config.tests.js b/test/specs/helpers.config.tests.js index b4d08b9602a..bac621938c6 100644 --- a/test/specs/helpers.config.tests.js +++ b/test/specs/helpers.config.tests.js @@ -719,6 +719,20 @@ describe('Chart.helpers.config', function() { expect(opts.fn).toEqual(1); }); + it('should support changing prefixes', function() { + const res = _createResolver([{test: 1, hoverTest: 2}]); + const opts = _attachContext(res, {ctx: 1}); + expect(opts.test).toEqual(1); + expect(opts.setContext({ctx: 2}, ['hover', '']).test).toEqual(2); + expect(opts.test).toEqual(1); + expect(opts.override('', ['hover', '']).test).toEqual(2); + }); + + it('should support prefixes to subnodes', function() { + const res = _createResolver([{node: {test: 1, hoverTest: 2}}], ['hover', '']); + expect(res.node.test).toEqual(2); + }); + it('should support common object methods', function() { const defaults = { option1: 'defaults'