aran-access
Version:
Access Control System for http://npmjs.com/aran
129 lines (109 loc) • 4.72 kB
JavaScript
const Array_isArray = Array.isArray;
const Object_assign = Object.assign;
const Reflect_apply = Reflect.apply;
const Reflect_construct = Reflect.construct;
const Reflect_defineProperty = Reflect.defineProperty;
const Reflect_deleteProperty = Reflect.deleteProperty;
const Reflect_get = Reflect.get;
const Reflect_getOwnPropertyDescriptor = Reflect.getOwnPropertyDescriptor;
const Reflect_getPrototypeOf = Reflect.getPrototypeOf;
const Reflect_has = Reflect.has;
const Reflect_isExtensible = Reflect.isExtensible;
const Reflect_preventExtensions = Reflect.preventExtensions;
const Reflect_ownKeys = Reflect.ownKeys;
const Reflect_set = Reflect.set;
const Reflect_setPrototypeOf = Reflect.setPrototypeOf;
module.exports = (membrane, capture, release) => {
const handlers = {};
handlers.apply = (target, value, values) => {
for (let index = 0, length = values.length; index < length; index++)
values[index] = membrane.enter(capture(values[index]));
return release(membrane.leave(Reflect_apply(target, capture(value), values)));
};
handlers.construct = (target, values) => {
for (let index = 0, length = values.length; index < length; index++)
values[index] = membrane.enter(capture(values[index]));
return release(membrane.leave(Reflect_construct(target, values)));
};
handlers.defineProperty = (target, key, descriptor) => {
if (Array_isArray(target) && String(key) === "length")
return Reflect_defineProperty(target, "length", descriptor);
if ("value" in descriptor) {
descriptor.value = membrane.enter(capture(descriptor.value));
} else {
if ("get" in descriptor)
descriptor.get = capture(descriptor.get);
if ("set" in descriptor)
descriptor.set = capture(descriptor.set);
}
return Reflect_defineProperty(target, key, descriptor);
};
handlers.deleteProperty = Reflect.deleteProperty;
// handlers.get = (target, key, receiver) => {
// if (Array_isArray(target) && String(key) === "length")
// return target.length;
// const descriptor = Reflect_getOwnPropertyDescriptor(target, key);
// if (descriptor) {
// if ("value" in descriptor)
// return release(membrane.leave(descriptor.value));
// if ("get" in descriptor)
// return Reflect_apply(release(descriptor.get), receiver, []);
// return void 0;
// }
// const prototype = Reflect_getPrototypeOf(target);
// if (prototype)
// return Reflect_get(release(prototype), key, receiver);
// if (key === "__proto__")
// return Reflect_getPrototypeOf(receiver);
// return void 0;
// };
handlers.getOwnPropertyDescriptor = (target, key) => {
if (Array_isArray(target) && String(key) === "length")
return Reflect_getOwnPropertyDescriptor(target, "length");
const descriptor = Reflect_getOwnPropertyDescriptor(target, key);
if (descriptor) {
if ("value" in descriptor) {
descriptor.value = release(membrane.leave(descriptor.value));
} else {
descriptor.get = release(descriptor.get);
descriptor.set = release(descriptor.set);
}
}
return descriptor;
};
handlers.getPrototypeOf = (target) => release(Reflect_getPrototypeOf(target));
// handlers.has = Reflect.has;
handlers.isExtensible = Reflect.isExtensible;
handlers.ownKeys = Reflect.ownKeys;
handlers.preventExtensions = Reflect.preventExtensions;
// handlers.set = (target, key, value, receiver) => {
// if (Array_isArray(target) && String(key) === "length")
// return target.length = value;
// const descriptor = Reflect_getOwnPropertyDescriptor(target, key);
// if (descriptor) {
// if (descriptor.writable)
// return Reflect_defineProperty(receiver, key, Object_assign({
// writable: true,
// enumerable: true,
// configurable: true
// }, Reflect_getOwnPropertyDescriptor(receiver), {value:value}));
// if (descriptor.set) {
// Reflect_apply(release(descriptor.set), receiver, [value]);
// return true;
// }
// return false;
// }
// const prototype = Reflect_getPrototypeOf(target);
// if (prototype)
// return Reflect_set(release(prototype), key, value, receiver);
// if (key === "__proto__")
// return Reflect_setPrototypeOf(receiver, value);
// return Reflect_defineProperty(receiver, key, Object_assign({
// writable: true,
// enumerable: true,
// configurable: true
// }, Reflect_getOwnPropertyDescriptor(receiver), {value:value}));
// };
handlers.setPrototypeOf = (target, prototype) => Reflect_setPrototypeOf(target, capture(prototype));
return handlers;
};