Skip to content

Commit

Permalink
[Refactor] use hasown instead of has
Browse files Browse the repository at this point in the history
  • Loading branch information
ljharb committed Oct 21, 2023
1 parent 538289b commit da0d497
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 27 deletions.
52 changes: 26 additions & 26 deletions 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();
Expand All @@ -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');
}

Expand All @@ -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`');
}
Expand All @@ -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'),
Expand All @@ -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');
Expand All @@ -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))
) {
Expand All @@ -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,
Expand All @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -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": {
Expand Down

0 comments on commit da0d497

Please sign in to comment.