const convertDataDescriptorToAccessor = (obj, prop) => { const descriptor = Object.getOwnPropertyDescriptor(obj, prop) let value = descriptor.value descriptor.get = function getter() { return value } if (descriptor.writable) { descriptor.set = function setter(val) { return (value = val) } } delete descriptor.value delete descriptor.writable Object.defineProperty(obj, prop, descriptor) return descriptor }
function init() { function isModuleNamespaceObjectLike(value) { if (! isObject(value) || getPrototypeOf(value) !== null) { return false } const descriptor = Reflect.getOwnPropertyDescriptor(value, Symbol.toStringTag) return descriptor !== void 0 && descriptor.configurable === false && descriptor.enumerable === false && descriptor.writable === false && descriptor.value === "Module" } return isModuleNamespaceObjectLike }
function init() { function isUpdatableGet(object, name) { const descriptor = Reflect.getOwnPropertyDescriptor(object, name) if (descriptor !== void 0) { // Section 9.5.8: [[Get]]() // Step 10: If either the data descriptor is not configurable or writable, // or the accessor descriptor has no getter, then the value must be the same. // https://tc39.github.io/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-get-p-receiver return descriptor.configurable === true || descriptor.writable === true || typeof descriptor.get === "function" } return true } return isUpdatableGet }
value, writable: exportedDescriptor.writable === true || typeof exportedDescriptor.set === "function"
function init() { function isUpdatableSet(object, name) { const descriptor = Reflect.getOwnPropertyDescriptor(object, name) if (descriptor !== void 0) { // Section 9.5.9: [[Set]]() // Step 11: If either the data descriptor is not configurable or writable, // or the accessor descriptor has no setter, then the value must be the same. // https://tc39.github.io/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver return descriptor.configurable === true || descriptor.writable === true || typeof descriptor.set === "function" } return true } return isUpdatableSet }
it('has correct descriptors defined for Map.prototype[Symbol.iterator]', function () { var descriptor = Object.getOwnPropertyDescriptor(Map.prototype, Symbol.iterator); proclaim.isTrue(descriptor.configurable); proclaim.isFalse(descriptor.enumerable); proclaim.isTrue(descriptor.writable); proclaim.doesNotInclude(descriptor, 'get'); proclaim.doesNotInclude(descriptor, 'set'); proclaim.ok(descriptor.value); });
/** * Is the stack property writable? */ export function isWritableStack(stackProp: PropertyDescriptor | undefined): boolean { return Boolean( // If there is no stack property, then it's writable, since assigning it will create it !stackProp || stackProp.writable || typeof stackProp.set === "function" ); }
it('has correct descriptors defined for Map.prototype.size', function () { var descriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'size'); proclaim.isTrue(descriptor.configurable); proclaim.isFalse(descriptor.enumerable); proclaim.doesNotInclude(descriptor.writable); proclaim.ok(descriptor.get); proclaim.isUndefined(descriptor.set); proclaim.include(descriptor, 'set'); proclaim.doesNotInclude(descriptor, 'value'); });
appendTo(node) { if (!(node instanceof Node)) throw new Error(`Failed to execute 'appendTo': Parameter 1 is not of type 'Node'.`); if (!Reflect.getOwnPropertyDescriptor(this, `parentNode`).writable) throw new Error(`Failed to execute 'appendTo': The new child element doesn't allow being appended to another node.`); if (wouldContainItself(this, node)) throw new Error(`Failed to execute 'appendTo': The new child element contains the parent.`); this.remove(); node.appendChild(this); }
it('has correct descriptors defined for Map.prototype.clear', function () { var descriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'clear'); proclaim.isTrue(descriptor.configurable); proclaim.isFalse(descriptor.enumerable); proclaim.isTrue(descriptor.writable); proclaim.doesNotInclude(descriptor, 'get'); proclaim.doesNotInclude(descriptor, 'set'); proclaim.ok(descriptor.value); });
const convertDataDescriptorToAccessor = (obj, prop) => { const descriptor = Object.getOwnPropertyDescriptor(obj, prop) let value = descriptor.value descriptor.get = function getter() { return value } if (descriptor.writable) { descriptor.set = function setter(val) { return (value = val) } } delete descriptor.value delete descriptor.writable Object.defineProperty(obj, prop, descriptor) return descriptor }
it('has correct descriptors defined for Map.prototype.entries', function () { var descriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'entries'); proclaim.isTrue(descriptor.configurable); proclaim.isFalse(descriptor.enumerable); proclaim.isTrue(descriptor.writable); proclaim.doesNotInclude(descriptor, 'get'); proclaim.doesNotInclude(descriptor, 'set'); proclaim.ok(descriptor.value); });
it('has correct descriptors defined for Map.prototype.constructor', function () { var descriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'constructor'); proclaim.isTrue(descriptor.configurable); proclaim.isFalse(descriptor.enumerable); proclaim.isTrue(descriptor.writable); proclaim.doesNotInclude(descriptor, 'get'); proclaim.doesNotInclude(descriptor, 'set'); proclaim.ok(descriptor.value); });
it('has correct descriptors defined for Map.prototype.delete', function () { var descriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'delete'); proclaim.isTrue(descriptor.configurable); proclaim.isFalse(descriptor.enumerable); proclaim.isTrue(descriptor.writable); proclaim.doesNotInclude(descriptor, 'get'); proclaim.doesNotInclude(descriptor, 'set'); proclaim.ok(descriptor.value); });
it('has correct descriptors defined for Map.prototype.values', function () { var descriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'values'); proclaim.isTrue(descriptor.configurable); proclaim.isFalse(descriptor.enumerable); proclaim.isTrue(descriptor.writable); proclaim.doesNotInclude(descriptor, 'get'); proclaim.doesNotInclude(descriptor, 'set'); proclaim.ok(descriptor.value); });