UNPKG

@difizen/mana-observable

Version:

204 lines (203 loc) 6.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Notifiable = void 0; var _manaCommon = require("@difizen/mana-common"); var _core = require("./core"); var _notifier = require("./notifier"); var _utils = require("./utils"); /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable prefer-spread */ var Notifiable; (function (_Notifiable) { var token = _Notifiable.token = Symbol('Notifiable'); function is(target) { return _utils.Observability.isObject(target) && !!target[_core.ObservableSymbol.Notifier]; } _Notifiable.is = is; function getNotifier(target) { return target[_core.ObservableSymbol.Notifier]; } _Notifiable.getNotifier = getNotifier; function tryGetNotifier(target) { if (is(target)) { return getNotifier(target); } return undefined; } _Notifiable.tryGetNotifier = tryGetNotifier; function set(target, value) { Reflect.defineMetadata(token, value, target); } _Notifiable.set = set; function get(target) { return Reflect.getMetadata(token, target); } _Notifiable.get = get; function canBeNotifiable(value) { if (!_utils.Observability.isObject(value)) { return false; } if (Object.isFrozen(value)) { return false; } if (value instanceof Array) { return true; } if (value instanceof Map) { return true; } if ((0, _manaCommon.isPlainObject)(value)) { return true; } return false; } _Notifiable.canBeNotifiable = canBeNotifiable; function transform(target) { if (is(target)) { return target; } if (!_utils.Observability.canBeObservable(target)) { return target; } var origin = _utils.Observability.getOrigin(target); var notifiable = Notifiable.get(origin); if (notifiable) { return notifiable; } if (origin instanceof Array) { return transformArray(origin); } if (origin instanceof Map) { return transformMap(origin); } if ((0, _manaCommon.isPlainObject)(origin)) { return transformPlainObject(origin); } return target; } _Notifiable.transform = transform; function transformArray(target) { var notifier = _notifier.Notifier.getOrCreate(target); var notifiable = new Proxy(target, { get: function get(self, property) { if (property === _core.ObservableSymbol.Notifier) { return notifier; } if (property === _core.ObservableSymbol.Self) { return self; } var result = Reflect.get(self, property); if ((0, _utils.isReadonly)(target, property)) { return result; } var origin = _utils.Observability.getOrigin(result); return Notifiable.transform(origin); }, set: function set(self, prop, value) { var result = Reflect.set(self, prop, value); notifier.notify(value); return result; } }); set(target, notifiable); return notifiable; } _Notifiable.transformArray = transformArray; function transformPlainObject(target) { var notifier = _notifier.Notifier.getOrCreate(target); var notifiable = new Proxy(target, { get: function get(self, property) { if (property === _core.ObservableSymbol.Notifier) { return notifier; } if (property === _core.ObservableSymbol.Self) { return self; } var result = Reflect.get(self, property); if ((0, _utils.isReadonly)(target, property)) { return result; } var origin = _utils.Observability.getOrigin(result); return Notifiable.transform(origin); }, set: function set(self, prop, value) { var result = Reflect.set(self, prop, value); notifier.notify(value); return result; }, deleteProperty: function deleteProperty(self, prop) { var result = Reflect.deleteProperty(self, prop); notifier.notify(undefined); return result; } }); set(target, notifiable); return notifiable; } _Notifiable.transformPlainObject = transformPlainObject; function transformMap(target) { var notifier = _notifier.Notifier.getOrCreate(target); var notifiable = new Proxy(target, { get: function get(self, prop) { if (prop === _core.ObservableSymbol.Notifier) { return notifier; } if (prop === _core.ObservableSymbol.Self) { return self; } var result; switch (prop) { case 'delete': return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } result = self.delete.apply(self, args); notifier.notify(undefined); return result; }; case 'clear': return function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } result = self.clear.apply(self, args); notifier.notify(undefined); return result; }; case 'set': return function () { for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } result = self.set.apply(self, args); notifier.notify(undefined); return result; }; case 'get': return function () { for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } result = self.get.apply(self, args); var origin = _utils.Observability.getOrigin(result); return Notifiable.transform(origin); }; default: result = Reflect.get(self, prop); if (typeof result === 'function') { return result.bind(self); } else { var origin = _utils.Observability.getOrigin(result); return Notifiable.transform(origin); } } } }); set(target, notifiable); return notifiable; } _Notifiable.transformMap = transformMap; })(Notifiable || (exports.Notifiable = Notifiable = {}));