diff --git a/ext/console/02_console.js b/ext/console/02_console.js index a160951790..d29bee8018 100644 --- a/ext/console/02_console.js +++ b/ext/console/02_console.js @@ -107,6 +107,7 @@ ReflectGet, ReflectGetOwnPropertyDescriptor, ReflectGetPrototypeOf, + ReflectHas, WeakMapPrototype, WeakSetPrototype, } = window.__bootstrap.primordials; @@ -327,7 +328,10 @@ function inspectFunction(value, level, inspectOptions) { const cyan = maybeColor(colors.cyan, inspectOptions); - if (customInspect in value && typeof value[customInspect] === "function") { + if ( + ReflectHas(value, customInspect) && + typeof value[customInspect] === "function" + ) { return String(value[customInspect](inspect)); } // Might be Function/AsyncFunction/GeneratorFunction/AsyncGeneratorFunction @@ -1203,7 +1207,10 @@ inspectOptions, proxyDetails, ) { - if (customInspect in value && typeof value[customInspect] === "function") { + if ( + ReflectHas(value, customInspect) && + typeof value[customInspect] === "function" + ) { return String(value[customInspect](inspect)); } // This non-unique symbol is used to support op_crates, ie. @@ -1212,7 +1219,7 @@ // Internal only, shouldn't be used by users. const privateCustomInspect = SymbolFor("Deno.privateCustomInspect"); if ( - privateCustomInspect in value && + ReflectHas(value, privateCustomInspect) && typeof value[privateCustomInspect] === "function" ) { // TODO(nayeemrmn): `inspect` is passed as an argument because custom @@ -2048,8 +2055,8 @@ const valueObj = value || {}; const keys = properties || ObjectKeys(valueObj); for (const k of keys) { - if (!primitive && k in valueObj) { - if (!(k in objectValues)) { + if (!primitive && ReflectHas(valueObj, k)) { + if (!(ReflectHas(objectValues, k))) { objectValues[k] = ArrayPrototypeFill(new Array(numRows), ""); } objectValues[k][idx] = stringifyValue(valueObj[k]); diff --git a/ext/web/02_event.js b/ext/web/02_event.js index d8b595c547..677768ac9b 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -32,6 +32,7 @@ ObjectGetOwnPropertyDescriptor, ObjectPrototypeIsPrototypeOf, ReflectDefineProperty, + ReflectHas, SafeArrayIterator, StringPrototypeStartsWith, Symbol, @@ -104,7 +105,7 @@ function hasRelatedTarget( event, ) { - return "relatedTarget" in event; + return ReflectHas(event, "relatedTarget"); } const isTrusted = ObjectGetOwnPropertyDescriptor({ @@ -450,7 +451,7 @@ function isNode( eventTarget, ) { - return Boolean(eventTarget && "nodeType" in eventTarget); + return Boolean(eventTarget && ReflectHas(eventTarget, "nodeType")); } // https://dom.spec.whatwg.org/#concept-shadow-including-inclusive-ancestor @@ -485,7 +486,7 @@ function isSlotable( nodeImpl, ) { - return Boolean(isNode(nodeImpl) && "assignedSlot" in nodeImpl); + return Boolean(isNode(nodeImpl) && ReflectHas(nodeImpl, "assignedSlot")); } // DOM Logic functions @@ -908,7 +909,7 @@ options = normalizeAddEventHandlerOptions(options); const { listeners } = (this ?? globalThis)[eventTargetData]; - if (!(type in listeners)) { + if (!(ReflectHas(listeners, type))) { listeners[type] = []; } @@ -952,7 +953,7 @@ }); const { listeners } = (this ?? globalThis)[eventTargetData]; - if (callback !== null && type in listeners) { + if (callback !== null && ReflectHas(listeners, type)) { listeners[type] = ArrayPrototypeFilter( listeners[type], (listener) => listener.callback !== callback, @@ -989,7 +990,7 @@ const self = this ?? window; const { listeners } = self[eventTargetData]; - if (!(event.type in listeners)) { + if (!ReflectHas(listeners, event.type)) { setTarget(event, this); return true; } diff --git a/ext/web/06_streams.js b/ext/web/06_streams.js index 7ef5a61317..6daea08983 100644 --- a/ext/web/06_streams.js +++ b/ext/web/06_streams.js @@ -41,6 +41,7 @@ PromiseResolve, queueMicrotask, RangeError, + ReflectHas, SharedArrayBuffer, Symbol, SymbolAsyncIterator, @@ -190,7 +191,7 @@ * @returns {boolean} */ function isDetachedBuffer(O) { - return isFakeDetached in O; + return ReflectHas(O, isFakeDetached); } /** @@ -392,7 +393,10 @@ * @returns {T} */ function dequeueValue(container) { - assert(_queue in container && _queueTotalSize in container); + assert( + ReflectHas(container, _queue) && + ReflectHas(container, _queueTotalSize), + ); assert(container[_queue].length); const valueWithSize = ArrayPrototypeShift(container[_queue]); container[_queueTotalSize] -= valueWithSize.size; @@ -410,7 +414,10 @@ * @returns {void} */ function enqueueValueWithSize(container, value, size) { - assert(_queue in container && _queueTotalSize in container); + assert( + ReflectHas(container, _queue) && + ReflectHas(container, _queueTotalSize), + ); if (isNonNegativeNumber(size) === false) { throw RangeError("chunk size isn't a positive number"); } @@ -592,7 +599,7 @@ */ function isReadableStream(value) { return !(typeof value !== "object" || value === null || - !(_controller in value)); + !ReflectHas(value, _controller)); } /** @@ -612,7 +619,7 @@ */ function isReadableStreamDefaultReader(value) { return !(typeof value !== "object" || value === null || - !(_readRequests in value)); + !ReflectHas(value, _readRequests)); } /** @@ -621,7 +628,7 @@ */ function isReadableStreamBYOBReader(value) { return !(typeof value !== "object" || value === null || - !(_readIntoRequests in value)); + !ReflectHas(value, _readIntoRequests)); } /** @@ -639,7 +646,7 @@ */ function isWritableStream(value) { return !(typeof value !== "object" || value === null || - !(_controller in value)); + !ReflectHas(value, _controller)); } /** @@ -659,7 +666,10 @@ * @returns {T | _close} */ function peekQueueValue(container) { - assert(_queue in container && _queueTotalSize in container); + assert( + ReflectHas(container, _queue) && + ReflectHas(container, _queueTotalSize), + ); assert(container[_queue].length); const valueWithSize = container[_queue][0]; return valueWithSize.value; @@ -4333,7 +4343,7 @@ highWaterMark, ); } else { - assert(!("type" in underlyingSourceDict)); + assert(!(ReflectHas(underlyingSourceDict, "type"))); const sizeAlgorithm = extractSizeAlgorithm(strategy); const highWaterMark = extractHighWaterMark(strategy, 1); setUpReadableStreamDefaultControllerFromUnderlyingSource( diff --git a/ext/web/15_performance.js b/ext/web/15_performance.js index c48a3d8882..41b40159e2 100644 --- a/ext/web/15_performance.js +++ b/ext/web/15_performance.js @@ -10,6 +10,7 @@ ArrayPrototypeSlice, ObjectKeys, ObjectPrototypeIsPrototypeOf, + ReflectHas, Symbol, SymbolFor, TypeError, @@ -470,17 +471,17 @@ throw new TypeError("Options cannot be passed with endMark."); } if ( - !("start" in startOrMeasureOptions) && - !("end" in startOrMeasureOptions) + !ReflectHas(startOrMeasureOptions, "start") && + !ReflectHas(startOrMeasureOptions, "end") ) { throw new TypeError( "A start or end mark must be supplied in options.", ); } if ( - "start" in startOrMeasureOptions && - "duration" in startOrMeasureOptions && - "end" in startOrMeasureOptions + ReflectHas(startOrMeasureOptions, "start") && + ReflectHas(startOrMeasureOptions, "duration") && + ReflectHas(startOrMeasureOptions, "end") ) { throw new TypeError( "Cannot specify start, end, and duration together in options.", @@ -492,13 +493,13 @@ endTime = convertMarkToTimestamp(endMark); } else if ( typeof startOrMeasureOptions === "object" && - "end" in startOrMeasureOptions + ReflectHas(startOrMeasureOptions, "end") ) { endTime = convertMarkToTimestamp(startOrMeasureOptions.end); } else if ( typeof startOrMeasureOptions === "object" && - "start" in startOrMeasureOptions && - "duration" in startOrMeasureOptions + ReflectHas(startOrMeasureOptions, "start") && + ReflectHas(startOrMeasureOptions, "duration") ) { const start = convertMarkToTimestamp(startOrMeasureOptions.start); const duration = convertMarkToTimestamp(startOrMeasureOptions.duration); @@ -509,13 +510,13 @@ let startTime; if ( typeof startOrMeasureOptions === "object" && - "start" in startOrMeasureOptions + ReflectHas(startOrMeasureOptions, "start") ) { startTime = convertMarkToTimestamp(startOrMeasureOptions.start); } else if ( typeof startOrMeasureOptions === "object" && - "end" in startOrMeasureOptions && - "duration" in startOrMeasureOptions + ReflectHas(startOrMeasureOptions, "end") && + ReflectHas(startOrMeasureOptions, "duration") ) { const end = convertMarkToTimestamp(startOrMeasureOptions.end); const duration = convertMarkToTimestamp(startOrMeasureOptions.duration); diff --git a/ext/webidl/00_webidl.js b/ext/webidl/00_webidl.js index a7f0597b10..d9c4f87cf0 100644 --- a/ext/webidl/00_webidl.js +++ b/ext/webidl/00_webidl.js @@ -57,6 +57,7 @@ ReflectApply, ReflectDefineProperty, ReflectGetOwnPropertyDescriptor, + ReflectHas, ReflectOwnKeys, RegExpPrototypeTest, Set, @@ -648,7 +649,7 @@ const defaultValues = {}; for (const member of allMembers) { - if ("defaultValue" in member) { + if (ReflectHas(member, "defaultValue")) { const idlMemberValue = member.defaultValue; const imvType = typeof idlMemberValue; // Copy by value types can be directly assigned, copy by reference types @@ -1013,13 +1014,16 @@ for (const key in descriptors) { if (key === "constructor") continue; const descriptor = descriptors[key]; - if ("value" in descriptor && typeof descriptor.value === "function") { + if ( + ReflectHas(descriptor, "value") && + typeof descriptor.value === "function" + ) { ObjectDefineProperty(prototype.prototype, key, { enumerable: true, writable: true, configurable: true, }); - } else if ("get" in descriptor) { + } else if (ReflectHas(descriptor, "get")) { ObjectDefineProperty(prototype.prototype, key, { enumerable: true, configurable: true, diff --git a/ext/webstorage/01_webstorage.js b/ext/webstorage/01_webstorage.js index 6640c04e56..5b9cccd6dd 100644 --- a/ext/webstorage/01_webstorage.js +++ b/ext/webstorage/01_webstorage.js @@ -13,6 +13,7 @@ ObjectFromEntries, ObjectEntries, ReflectGet, + ReflectHas, Proxy, } = window.__bootstrap.primordials; @@ -113,7 +114,7 @@ }, get(target, key) { if (typeof key == "symbol") return target[key]; - if (key in target) { + if (ReflectHas(target, key)) { return ReflectGet(...new SafeArrayIterator(arguments)); } else { return target.getItem(key) ?? undefined; @@ -141,7 +142,7 @@ if (arguments.length === 1) { return undefined; } - if (key in target) { + if (ReflectHas(target, key)) { return undefined; } const value = target.getItem(key); diff --git a/runtime/js/10_permissions.js b/runtime/js/10_permissions.js index f3498b9505..1a9be1f275 100644 --- a/runtime/js/10_permissions.js +++ b/runtime/js/10_permissions.js @@ -21,6 +21,7 @@ FunctionPrototypeCall, PromiseResolve, PromiseReject, + ReflectHas, SymbolFor, TypeError, } = window.__bootstrap.primordials; @@ -120,7 +121,10 @@ */ function cache(desc, state) { let { name: key } = desc; - if ((desc.name === "read" || desc.name === "write") && "path" in desc) { + if ( + (desc.name === "read" || desc.name === "write") && + ReflectHas(desc, "path") + ) { key += `-${desc.path}`; } else if (desc.name === "net" && desc.host) { key += `-${desc.host}`;