@difizen/mana-observable
Version:
62 lines (61 loc) • 1.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.watch = watch;
var _manaCommon = require("@difizen/mana-common");
var _notifier = require("./notifier");
var _observable = require("./observable");
var _utils = require("./utils");
function tryObservable(target) {
var data = (0, _utils.getOrigin)(target);
if (!_utils.Observability.canBeObservable(data)) {
return data;
}
if (!_utils.Observability.marked(data)) {
return (0, _observable.observable)(data);
}
return data;
}
function watchAll(target, callback) {
var data = (0, _utils.getOrigin)(target);
if (!_utils.Observability.canBeObservable(data)) {
return _manaCommon.Disposable.NONE;
}
tryObservable(data);
var event = _notifier.Notifier.toEvent(data);
if (event === _manaCommon.Event.None) {
console.warn('Cannot add watcher for unobservable target', target);
return _manaCommon.Disposable.NONE;
}
var props = Object.keys(data);
if (props) {
props.forEach(function (prop) {
return _notifier.Notifier.find(target, prop);
});
}
return event(callback);
}
function watchProp(target, prop, callback) {
var origin = (0, _utils.getOrigin)(target);
tryObservable(origin);
var event = _notifier.Notifier.toEvent(origin, prop);
if (event === _manaCommon.Event.None) {
console.warn("Cannot add watcher for unobservable property ".concat(prop.toString()), target);
return _manaCommon.Disposable.NONE;
}
return event(callback);
}
function watch(target, prop, callback) {
var cb;
if (typeof prop === 'function') {
cb = prop;
return watchAll(target, cb);
}
if (typeof prop === 'string' && callback) {
cb = callback;
return watchProp(target, prop, cb);
}
console.warn("Invalid arguments for watch ".concat(prop.toString()), target);
return _manaCommon.Disposable.NONE;
}