From da0d497e819a060b75c94027bf92cddc52777540 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Fri, 20 Oct 2023 22:41:02 -0700 Subject: [PATCH] [Refactor] use `hasown` instead of `has` --- index.js | 52 ++++++++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/index.js b/index.js index 0588a49..68ac518 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,6 @@ 'use strict'; -var has = require('has'); +var hasOwn = require('hasown'); var hasPropertyDescriptors = require('has-property-descriptors'); var isArray = require('isarray'); var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames(); @@ -16,20 +16,20 @@ var $TypeError = TypeError; var $SyntaxError = SyntaxError; module.exports = function mockProperty(obj, prop, options) { - if (has(options, 'nonEnumerable') && typeof options.nonEnumerable !== 'boolean') { + if (hasOwn(options, 'nonEnumerable') && typeof options.nonEnumerable !== 'boolean') { throw new $TypeError('`nonEnumerable` option, when present, must be a boolean'); } - if (has(options, 'nonWritable') && typeof options.nonWritable !== 'boolean') { + if (hasOwn(options, 'nonWritable') && typeof options.nonWritable !== 'boolean') { throw new $TypeError('`nonEnumerable` option, when present, must be a boolean'); } - if (has(options, 'delete') && typeof options['delete'] !== 'boolean') { + if (hasOwn(options, 'delete') && typeof options['delete'] !== 'boolean') { throw new $TypeError('`delete` option, when present, must be a boolean'); } - var wantsData = has(options, 'value') || has(options, 'nonWritable'); - var wantsAccessor = has(options, 'get') || has(options, 'set'); + var wantsData = hasOwn(options, 'value') || hasOwn(options, 'nonWritable'); + var wantsAccessor = hasOwn(options, 'get') || hasOwn(options, 'set'); - if (options['delete'] && (wantsData || wantsAccessor || has(options, 'nonEnumerable'))) { + if (options['delete'] && (wantsData || wantsAccessor || hasOwn(options, 'nonEnumerable'))) { throw new $TypeError('`delete` option must not be set to true when any of `value`, `get`, `set`, `nonWritable`, or `nonEnumerable` are provided'); } @@ -38,8 +38,8 @@ module.exports = function mockProperty(obj, prop, options) { throw new $TypeError('`value` and `nonWritable` options are mutually exclusive with `get`/`set` options'); } if ( - (has(options, 'get') && typeof options.get !== 'function' && typeof options.get !== 'undefined') - || (has(options, 'set') && typeof options.set !== 'function' && typeof options.set !== 'undefined') + (hasOwn(options, 'get') && typeof options.get !== 'function' && typeof options.get !== 'undefined') + || (hasOwn(options, 'set') && typeof options.set !== 'function' && typeof options.set !== 'undefined') ) { throw new $TypeError('`get` and `set` options, when present, must be functions or `undefined`'); } @@ -51,7 +51,7 @@ module.exports = function mockProperty(obj, prop, options) { var objIsArray = isArray(obj); var origDescriptor = gOPD ? gOPD(obj, prop) - : has(obj, prop) + : hasOwn(obj, prop) ? { configurable: typeof obj === 'function' && prop === 'name' ? functionsHaveConfigurableNames : true, enumerable: !(hasDescriptors && objIsArray && prop === 'length'), @@ -66,37 +66,37 @@ module.exports = function mockProperty(obj, prop, options) { if (wantsAccessor) { var hasGetter = origDescriptor && typeof origDescriptor.get === 'function'; var hasSetter = origDescriptor && typeof origDescriptor.set === 'function'; - var hasFutureGetter = has(options, 'get') ? typeof options.get === 'function' : hasGetter; - var hasFutureSetter = has(options, 'set') ? typeof options.set === 'function' : hasSetter; + var hasFutureGetter = hasOwn(options, 'get') ? typeof options.get === 'function' : hasGetter; + var hasFutureSetter = hasOwn(options, 'set') ? typeof options.set === 'function' : hasSetter; if (!hasFutureGetter && !hasFutureSetter) { throw new $TypeError('when the `get` or `set` options are provided, the mocked object property must end up with at least one of a getter or a setter function'); } } - var isChangingEnumerability = has(options, 'nonEnumerable') ? !options.nonEnumerable !== origEnumerable : false; + var isChangingEnumerability = hasOwn(options, 'nonEnumerable') ? !options.nonEnumerable !== origEnumerable : false; if (origDescriptor && !origDescriptor.configurable) { if (isChangingEnumerability) { throw new $TypeError('`' + prop + '` is nonconfigurable, and can not be changed'); } if (wantsAccessor) { - if (has(origDescriptor, 'value')) { + if (hasOwn(origDescriptor, 'value')) { throw new $TypeError('`' + prop + '` is a nonconfigurable data property, and can not be changed to an accessor'); } - var isChangingGetter = has(options, 'get') && has(origDescriptor, 'get') && options.get !== origDescriptor.get; - var isChangingSetter = has(options, 'set') && has(origDescriptor, 'set') && options.set !== origDescriptor.set; + var isChangingGetter = hasOwn(options, 'get') && hasOwn(origDescriptor, 'get') && options.get !== origDescriptor.get; + var isChangingSetter = hasOwn(options, 'set') && hasOwn(origDescriptor, 'set') && options.set !== origDescriptor.set; if (isChangingGetter || isChangingSetter) { throw new $TypeError('`' + prop + '` is nonconfigurable, and can not be changed'); } return function restore() {}; } - if (has(origDescriptor, 'get') || has(origDescriptor, 'set')) { + if (hasOwn(origDescriptor, 'get') || hasOwn(origDescriptor, 'set')) { throw new $TypeError('`' + prop + '` is a nonconfigurable accessor property, and can not be changed to a data property'); } - var isChangingValue = has(options, 'value') && has(origDescriptor, 'value') && options.value !== origDescriptor.value; - var isChangingWriteability = has(options, 'nonWritable') && !options.nonWritable !== origDescriptor.writable; + var isChangingValue = hasOwn(options, 'value') && hasOwn(origDescriptor, 'value') && options.value !== origDescriptor.value; + var isChangingWriteability = hasOwn(options, 'nonWritable') && !options.nonWritable !== origDescriptor.writable; if ((!origDescriptor.writable && isChangingValue) || isChangingEnumerability || isChangingWriteability) { throw new $TypeError('`' + prop + '` is nonconfigurable, and can not be changed'); @@ -112,7 +112,7 @@ module.exports = function mockProperty(obj, prop, options) { wantsData && !isChangingEnumerability && (!origDescriptor || origDescriptor.enumerable) - && (!has(options, 'nonWritable') || !options.nonWritable) + && (!hasOwn(options, 'nonWritable') || !options.nonWritable) && (!origDescriptor || origDescriptor.writable) && (!gOPD || !(prop in obj)) ) { @@ -122,19 +122,19 @@ module.exports = function mockProperty(obj, prop, options) { throw new $SyntaxError('this environment does not support Define on an array’s length'); } - var newEnumerable = has(options, 'nonEnumerable') ? !options.nonEnumerable : origEnumerable; + var newEnumerable = hasOwn(options, 'nonEnumerable') ? !options.nonEnumerable : origEnumerable; if (wantsData) { defineDataProperty( obj, prop, - has(options, 'value') ? options.value : origDescriptor.value, + hasOwn(options, 'value') ? options.value : origDescriptor.value, !newEnumerable, - has(options, 'nonWritable') ? options.nonWritable : has(origDescriptor, 'writable') ? !origDescriptor.writable : false + hasOwn(options, 'nonWritable') ? options.nonWritable : hasOwn(origDescriptor, 'writable') ? !origDescriptor.writable : false ); } else if (wantsAccessor) { - var getter = has(options, 'get') ? options.get : origDescriptor && origDescriptor.get; - var setter = has(options, 'set') ? options.set : origDescriptor && origDescriptor.set; + var getter = hasOwn(options, 'get') ? options.get : origDescriptor && origDescriptor.get; + var setter = hasOwn(options, 'set') ? options.set : origDescriptor && origDescriptor.set; $defineProperty(obj, prop, { configurable: origConfigurable, @@ -156,7 +156,7 @@ module.exports = function mockProperty(obj, prop, options) { if (!origDescriptor) { delete obj[prop]; // eslint-disable-line no-param-reassign } else if ($defineProperty) { - if (has(origDescriptor, 'writable')) { + if (hasOwn(origDescriptor, 'writable')) { defineDataProperty( obj, prop, diff --git a/package.json b/package.json index fe2b473..4f73d1b 100644 --- a/package.json +++ b/package.json @@ -63,8 +63,8 @@ "define-data-property": "^1.1.1", "functions-have-names": "^1.2.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "hasown": "^2.0.0", "isarray": "^2.0.5" }, "engines": {