const __zdFnToString = Function.prototype.toString;
const __zdMarks = new WeakMap(); const __zdNativeStr = (name) => "function " + name + "() { [native code] }";
const __zdFakeToString = function toString() {
const s = __zdMarks.get(this);
return s !== undefined ? s : __zdFnToString.call(this);
};
__zdMarks.set(__zdFakeToString, __zdNativeStr("toString"));
__zdMarks.set(__zdFnToString, __zdNativeStr("toString"));
Object.defineProperty(Function.prototype, "toString", {
value: __zdFakeToString,
writable: true,
enumerable: false,
configurable: true,
});
const __zdNameLen = (fn, name, length) => {
Object.defineProperty(fn, "name", { value: name, configurable: true });
Object.defineProperty(fn, "length", { value: length, configurable: true });
};
const __zdMark = (fn, name, length) => {
__zdNameLen(fn, name, length);
__zdMarks.set(fn, __zdNativeStr(name));
return fn;
};
const __zdReplace = (obj, prop, make) => {
const orig = obj[prop];
const fn = make(orig);
const name = orig && orig.name ? orig.name : prop;
const length =
orig && typeof orig.length === "number" ? orig.length : fn.length;
__zdMark(fn, name, length);
const __d = Object.getOwnPropertyDescriptor(obj, prop);
Object.defineProperty(obj, prop, {
value: fn,
writable: true,
enumerable: __d ? __d.enumerable : true,
configurable: true,
});
return fn;
};
const __zdGetter = (obj, prop, getFn, opts) => {
opts = opts || {};
__zdNameLen(getFn, "get " + prop, 0);
__zdMarks.set(getFn, "function get " + prop + "() { [native code] }");
const desc = { get: getFn, enumerable: !!opts.enumerable, configurable: true };
if (opts.setFn) {
__zdNameLen(opts.setFn, "set " + prop, 1);
__zdMarks.set(opts.setFn, "function set " + prop + "() { [native code] }");
desc.set = opts.setFn;
}
Object.defineProperty(obj, prop, desc);
};