pushinka
Version:
Pushinka: Transactional, Reactive, and Asynchronous State Management
122 lines • 4.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var P_DECOR = Symbol("p.decor");
var P_BINDING = Symbol("p.binding");
var Utils = (function () {
function Utils() {
}
Utils.get = function (obj, sym) {
return obj[sym];
};
Utils.set = function (obj, sym, value) {
Object.defineProperty(obj, sym, { value: value, configurable: false, enumerable: false });
return obj;
};
Utils.decorate = function (target, decorator) {
Object.defineProperty(target, P_DECOR, { value: decorator, configurable: false, enumerable: false });
};
Utils.acquireDecorationTable = function (target) {
var result = Utils.get(target, P_DECOR);
if (!target.hasOwnProperty(P_DECOR)) {
result = Object.setPrototypeOf({}, result || {});
Utils.set(target, P_DECOR, result);
}
return result;
};
Utils.decorationOf = function (target) {
return Utils.get(target, P_DECOR);
};
Utils.hookArrayItem = function (array, index) {
var t = array[index];
var getter = function () { return t; };
var setter = function (value) {
var a = array;
if (Object.isFrozen(a)) {
var binding = Utils.get(a, P_BINDING);
a = a.slice();
binding.object[binding.prop] = a;
}
a[index] = value;
};
var pd = Object.getOwnPropertyDescriptor(array, index);
Object.defineProperty(array, index, { configurable: true, enumerable: pd ? pd.enumerable : true, get: getter, set: setter });
};
Utils.hookArrayMethod = function (array, method) {
array[method.name] = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var a = array;
if (Object.isFrozen(a)) {
var binding = Utils.get(a, P_BINDING);
a = a.slice();
binding.object[binding.prop] = a;
}
return method.call.apply(method, [a].concat(args));
};
};
Utils.freezeArray = function (arr, binding) {
if (Utils.get(arr, P_BINDING))
throw new Error("E610: array cannot be referenced from multiple objects");
Utils.set(arr, P_BINDING, binding);
for (var item in arr)
Utils.hookArrayItem(arr, item);
for (var _i = 0, _a = [arr.push, arr.pop, arr.shift, arr.sort, arr.splice, arr.unshift]; _i < _a.length; _i++) {
var method = _a[_i];
Utils.hookArrayMethod(arr, method);
}
Object.freeze(arr);
};
Utils.freezeSet = function (obj) {
if (obj instanceof Set) {
var pd = { configurable: false, enumerable: false, get: forbidden, set: forbidden };
Object.defineProperty(obj, "add", pd);
Object.defineProperty(obj, "delete", pd);
Object.defineProperty(obj, "clear", pd);
Object.freeze(obj);
}
};
Utils.freezeMap = function (obj) {
if (obj instanceof Map) {
var pd = { configurable: false, enumerable: false, get: forbidden, set: forbidden };
Object.defineProperty(obj, "set", pd);
Object.defineProperty(obj, "delete", pd);
Object.defineProperty(obj, "clear", pd);
Object.freeze(obj);
}
};
Utils.replicate = function (source, target) {
for (var _i = 0, _a = Object.getOwnPropertyNames(source); _i < _a.length; _i++) {
var prop = _a[_i];
Utils.replicateProp(source, target, prop);
}
for (var _b = 0, _c = Object.getOwnPropertySymbols(source); _b < _c.length; _b++) {
var prop = _c[_b];
Utils.replicateProp(source, target, prop);
}
return target;
};
Utils.replicateProp = function (source, target, prop) {
var pd = Object.getOwnPropertyDescriptor(source, prop);
if (pd) {
pd.writable = true;
Object.defineProperty(target, prop, pd);
}
};
return Utils;
}());
exports.Utils = Utils;
function forbidden() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
throw new Error("this method should never be called");
}
exports.forbidden = forbidden;
function rethrow(error) {
throw error;
}
exports.rethrow = rethrow;
//# sourceMappingURL=Utils.js.map