return isFunction(fallback) ? fallback(prop, value) : fallback;
}
-const getScope = (key, parent) => key === true ? parent : resolveObjectKey(parent, key);
+const getScope = (key, parent) => key === true ? parent
+ : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;
function addScopes(set, parentScopes, key, parentFallback) {
for (const parent of parentScopes) {
const scope = getScope(key, parent);
if (scope) {
set.add(scope);
- const fallback = scope._fallback;
+ const fallback = resolveFallback(scope._fallback, key, scope);
if (defined(fallback) && fallback !== key && fallback !== parentFallback) {
// When we reach the descriptor that defines a new _fallback, return that.
// The fallback will resume to that new scope.
});
});
+ it('should support _fallback as function', function() {
+ const descriptors = {
+ _fallback: (prop, value) => prop === 'hover' && value.shouldFall && 'interaction',
+ };
+ const defaults = {
+ interaction: {
+ mode: 'test',
+ priority: 'fall'
+ },
+ hover: {
+ priority: 'main'
+ }
+ };
+ const options = {
+ interaction: {
+ a: 1
+ },
+ hover: {
+ shouldFall: true,
+ b: 2
+ }
+ };
+ const resolver = _createResolver([options, defaults, descriptors]);
+ expect(resolver.hover).toEqualOptions({
+ mode: 'test',
+ priority: 'main',
+ a: 1,
+ b: 2
+ });
+ });
+
it('should not fallback by default', function() {
const defaults = {
hover: {