'use strict'; 
 | 
var $ = require('../internals/export'); 
 | 
var call = require('../internals/function-call'); 
 | 
var anObject = require('../internals/an-object'); 
 | 
var isObject = require('../internals/is-object'); 
 | 
var isDataDescriptor = require('../internals/is-data-descriptor'); 
 | 
var fails = require('../internals/fails'); 
 | 
var definePropertyModule = require('../internals/object-define-property'); 
 | 
var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor'); 
 | 
var getPrototypeOf = require('../internals/object-get-prototype-of'); 
 | 
var createPropertyDescriptor = require('../internals/create-property-descriptor'); 
 | 
  
 | 
// `Reflect.set` method 
 | 
// https://tc39.es/ecma262/#sec-reflect.set 
 | 
function set(target, propertyKey, V /* , receiver */) { 
 | 
  var receiver = arguments.length < 4 ? target : arguments[3]; 
 | 
  var ownDescriptor = getOwnPropertyDescriptorModule.f(anObject(target), propertyKey); 
 | 
  var existingDescriptor, prototype, setter; 
 | 
  if (!ownDescriptor) { 
 | 
    if (isObject(prototype = getPrototypeOf(target))) { 
 | 
      return set(prototype, propertyKey, V, receiver); 
 | 
    } 
 | 
    ownDescriptor = createPropertyDescriptor(0); 
 | 
  } 
 | 
  if (isDataDescriptor(ownDescriptor)) { 
 | 
    if (ownDescriptor.writable === false || !isObject(receiver)) return false; 
 | 
    if (existingDescriptor = getOwnPropertyDescriptorModule.f(receiver, propertyKey)) { 
 | 
      if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false; 
 | 
      existingDescriptor.value = V; 
 | 
      definePropertyModule.f(receiver, propertyKey, existingDescriptor); 
 | 
    } else definePropertyModule.f(receiver, propertyKey, createPropertyDescriptor(0, V)); 
 | 
  } else { 
 | 
    setter = ownDescriptor.set; 
 | 
    if (setter === undefined) return false; 
 | 
    call(setter, receiver, V); 
 | 
  } return true; 
 | 
} 
 | 
  
 | 
// MS Edge 17-18 Reflect.set allows setting the property to object 
 | 
// with non-writable property on the prototype 
 | 
var MS_EDGE_BUG = fails(function () { 
 | 
  var Constructor = function () { /* empty */ }; 
 | 
  var object = definePropertyModule.f(new Constructor(), 'a', { configurable: true }); 
 | 
  // eslint-disable-next-line es/no-reflect -- required for testing 
 | 
  return Reflect.set(Constructor.prototype, 'a', 1, object) !== false; 
 | 
}); 
 | 
  
 | 
$({ target: 'Reflect', stat: true, forced: MS_EDGE_BUG }, { 
 | 
  set: set 
 | 
}); 
 |