* @param {object[]} scopes
* @param {object} [context]
* @param {string[]} [prefixes]
+ * @param {{scriptable: boolean, indexable: boolean}} [descriptorDefaults]
*/
- createResolver(scopes, context, prefixes = ['']) {
+ createResolver(scopes, context, prefixes = [''], descriptorDefaults) {
const {resolver} = getResolver(this._resolverCache, scopes, prefixes);
return isObject(context)
- ? _attachContext(resolver, isFunction(context) ? context() : context)
+ ? _attachContext(resolver, context, undefined, descriptorDefaults)
: resolver;
}
}
* @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
* @private
*/
-export function _attachContext(proxy, context, subProxy) {
+export function _attachContext(proxy, context, subProxy, descriptorDefaults) {
const cache = {
_cacheable: false,
_proxy: proxy,
_context: context,
_subProxy: subProxy,
_stack: new Set(),
- _descriptors: _descriptors(proxy),
- setContext: (ctx) => _attachContext(proxy, ctx, subProxy),
- override: (scope) => _attachContext(proxy.override(scope), context, subProxy)
+ _descriptors: _descriptors(proxy, descriptorDefaults),
+ setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),
+ override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)
};
return new Proxy(cache, {
/**
/**
* @private
*/
-export function _descriptors(proxy) {
- const {_scriptable = true, _indexable = true} = proxy;
+export function _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {
+ const {_scriptable = defaults.scriptable, _indexable = defaults.indexable} = proxy;
return {
+ scriptable: _scriptable,
+ indexable: _indexable,
isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,
isIndexable: isFunction(_indexable) ? _indexable : () => _indexable
};
}
if (needsSubResolver(prop, value)) {
// if the resolved value is an object, crate a sub resolver for it
- value = _attachContext(value, _context, _subProxy && _subProxy[prop]);
+ value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);
}
return value;
}
}
function _resolveArray(prop, value, target, isIndexable) {
- const {_proxy, _context, _subProxy} = target;
+ const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;
if (defined(_context.index) && isIndexable(prop)) {
value = value[_context.index % value.length];
value = [];
for (const item of arr) {
const resolver = createSubResolver(scopes, _proxy, prop, item);
- value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop]));
+ value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));
}
}
return value;
// The plugin on the chart should only be started once
expect(results).toEqual([1]);
});
+
+ it('should default to false for _scriptable, _indexable', function(done) {
+ const plugin = {
+ id: 'test',
+ start: function(chart, args, opts) {
+ expect(opts.fun).toEqual(jasmine.any(Function));
+ expect(opts.fun()).toEqual('test');
+ expect(opts.arr).toEqual([1, 2, 3]);
+
+ expect(opts.sub.subfun).toEqual(jasmine.any(Function));
+ expect(opts.sub.subfun()).toEqual('subtest');
+ expect(opts.sub.subarr).toEqual([3, 2, 1]);
+ done();
+ }
+ };
+ window.acquireChart({
+ options: {
+ plugins: {
+ test: {
+ fun: () => 'test',
+ arr: [1, 2, 3],
+ sub: {
+ subfun: () => 'subtest',
+ subarr: [3, 2, 1],
+ }
+ }
+ }
+ },
+ plugins: [plugin]
+ });
+ });
});
});