@web-native-js/reflex
Version:
Reflex is a reactivity library.
49 lines (46 loc) • 1.69 kB
JavaScript
/**
* @imports
*/
import _objFrom from '@web-native-js/commons/obj/from.js';
import _isArray from '@web-native-js/commons/js/isArray.js';
import _isNumeric from '@web-native-js/commons/js/isNumeric.js';
import _isClass from '@web-native-js/commons/js/isClass.js';
import _isFunction from '@web-native-js/commons/js/isFunction.js';
import _isTypeObject from '@web-native-js/commons/js/isTypeObject.js';
import QueryEvent from './internal/QueryEvent.js';
import TrapBase from './internal/TrapBase.js';
import transaction from './transaction.js';
/**
* Runs a "get" query operation on a target.
* Fires any such query observers that may be bound to target.
*
* @param array|object target
* @param string|array keys
*
* @return mixed
*/
export default function(target, keys) {
if (!target || !_isTypeObject(target)) {
throw new Error('Target must be of type object!');
}
// ---------------------------------
// Execute any "get" traps, otherwise "get" the default way
var value, trapBase, defaultGet = function(_value) {
return arguments.length ? _value : (_isArray(keys) ? _objFrom(keys, target) : target[keys]);
};
if (trapBase = TrapBase.getForTarget(target)) {
value = trapBase.fire(new QueryEvent(target, {type:'get', query:keys}), defaultGet);
} else {
value = defaultGet();
}
// ---------------------------------
// Execute array methods in "mutation" mode
if (_isArray(target) && !_isNumeric(keys) && _isFunction(value) && !_isClass(value)) {
return function reflexArrayMethodWrapper(...args) {
return transaction([target], () => {
return value.apply(target, args);
});
};
}
return value;
}