| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | 'use strict';var $gOPD = require('gopd');var $SyntaxError = require('es-errors/syntax');var $TypeError = require('es-errors/type');var isObject = require('es-object-atoms/isObject');var isPropertyDescriptor = require('../helpers/records/property-descriptor');var IsAccessorDescriptor = require('./IsAccessorDescriptor');var IsExtensible = require('./IsExtensible');var isPropertyKey = require('../helpers/isPropertyKey');var ToPropertyDescriptor = require('./ToPropertyDescriptor');var SameValue = require('./SameValue');var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');// https://262.ecma-international.org/6.0/#sec-ordinarydefineownpropertymodule.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {	if (!isObject(O)) {		throw new $TypeError('Assertion failed: O must be an Object');	}	if (!isPropertyKey(P)) {		throw new $TypeError('Assertion failed: P must be a Property Key');	}	if (!isPropertyDescriptor(Desc)) {		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');	}	if (!$gOPD) {		// ES3/IE 8 fallback		if (IsAccessorDescriptor(Desc)) {			throw new $SyntaxError('This environment does not support accessor property descriptors.');		}		var creatingNormalDataProperty = !(P in O)			&& Desc['[[Writable]]']			&& Desc['[[Enumerable]]']			&& Desc['[[Configurable]]']			&& '[[Value]]' in Desc;		var settingExistingDataProperty = (P in O)			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])			&& '[[Value]]' in Desc;		if (creatingNormalDataProperty || settingExistingDataProperty) {			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign			return SameValue(O[P], Desc['[[Value]]']);		}		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');	}	var desc = $gOPD(O, P);	var current = desc && ToPropertyDescriptor(desc);	var extensible = IsExtensible(O);	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);};
 |