You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							63 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
	
	
							63 lines
						
					
					
						
							1.8 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
var GetIntrinsic = require('get-intrinsic'); | 
						|
 | 
						|
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); | 
						|
 | 
						|
if ($defineProperty) { | 
						|
	try { | 
						|
		$defineProperty({}, 'a', { value: 1 }); | 
						|
	} catch (e) { | 
						|
		// IE 8 has a broken defineProperty | 
						|
		$defineProperty = null; | 
						|
	} | 
						|
} | 
						|
 | 
						|
// node v0.6 has a bug where array lengths can be Set but not Defined | 
						|
var hasArrayLengthDefineBug = Object.defineProperty && Object.defineProperty([], 'length', { value: 1 }).length === 0; | 
						|
 | 
						|
// eslint-disable-next-line global-require | 
						|
var isArray = hasArrayLengthDefineBug && require('../2020/IsArray'); // this does not depend on any other AOs. | 
						|
 | 
						|
var callBound = require('call-bind/callBound'); | 
						|
 | 
						|
var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable'); | 
						|
 | 
						|
// eslint-disable-next-line max-params | 
						|
module.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) { | 
						|
	if (!$defineProperty) { | 
						|
		if (!IsDataDescriptor(desc)) { | 
						|
			// ES3 does not support getters/setters | 
						|
			return false; | 
						|
		} | 
						|
		if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) { | 
						|
			return false; | 
						|
		} | 
						|
 | 
						|
		// fallback for ES3 | 
						|
		if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) { | 
						|
			// a non-enumerable existing property | 
						|
			return false; | 
						|
		} | 
						|
 | 
						|
		// property does not exist at all, or exists but is enumerable | 
						|
		var V = desc['[[Value]]']; | 
						|
		// eslint-disable-next-line no-param-reassign | 
						|
		O[P] = V; // will use [[Define]] | 
						|
		return SameValue(O[P], V); | 
						|
	} | 
						|
	if ( | 
						|
		hasArrayLengthDefineBug | 
						|
		&& P === 'length' | 
						|
		&& '[[Value]]' in desc | 
						|
		&& isArray(O) | 
						|
		&& O.length !== desc['[[Value]]'] | 
						|
	) { | 
						|
		// eslint-disable-next-line no-param-reassign | 
						|
		O.length = desc['[[Value]]']; | 
						|
		return O.length === desc['[[Value]]']; | 
						|
	} | 
						|
 | 
						|
	$defineProperty(O, P, FromPropertyDescriptor(desc)); | 
						|
	return true; | 
						|
};
 | 
						|
 |