| 'use strict'; | 
|   | 
| var GetIntrinsic = require('get-intrinsic'); | 
|   | 
| var $TypeError = GetIntrinsic('%TypeError%'); | 
|   | 
| var callBound = require('call-bind/callBound'); | 
| var forEach = require('../helpers/forEach'); | 
| var every = require('../helpers/every'); | 
| var some = require('../helpers/some'); | 
| var OwnPropertyKeys = require('../helpers/OwnPropertyKeys'); | 
|   | 
| var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable'); | 
|   | 
| var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow'); | 
| var Get = require('./Get'); | 
| var IsArray = require('./IsArray'); | 
| var IsIntegralNumber = require('./IsIntegralNumber'); | 
| var IsPropertyKey = require('./IsPropertyKey'); | 
| var SameValue = require('./SameValue'); | 
| var ToNumber = require('./ToNumber'); | 
| var ToObject = require('./ToObject'); | 
| var Type = require('./Type'); | 
|   | 
| // https://www.ecma-international.org/ecma-262/12.0/#sec-copydataproperties | 
|   | 
| module.exports = function CopyDataProperties(target, source, excludedItems) { | 
|     if (Type(target) !== 'Object') { | 
|         throw new $TypeError('Assertion failed: "target" must be an Object'); | 
|     } | 
|   | 
|     if (!IsArray(excludedItems) || !every(excludedItems, IsPropertyKey)) { | 
|         throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys'); | 
|     } | 
|   | 
|     if (typeof source === 'undefined' || source === null) { | 
|         return target; | 
|     } | 
|   | 
|     var from = ToObject(source); | 
|   | 
|     var keys = OwnPropertyKeys(from); | 
|     forEach(keys, function (nextKey) { | 
|         var excluded = some(excludedItems, function (e) { | 
|             return SameValue(e, nextKey) === true; | 
|         }); | 
|         /* | 
|         var excluded = false; | 
|   | 
|         forEach(excludedItems, function (e) { | 
|             if (SameValue(e, nextKey) === true) { | 
|                 excluded = true; | 
|             } | 
|         }); | 
|         */ | 
|   | 
|         var enumerable = $isEnumerable(from, nextKey) || ( | 
|         // this is to handle string keys being non-enumerable in older engines | 
|             typeof source === 'string' | 
|             && nextKey >= 0 | 
|             && IsIntegralNumber(ToNumber(nextKey)) | 
|         ); | 
|         if (excluded === false && enumerable) { | 
|             var propValue = Get(from, nextKey); | 
|             CreateDataPropertyOrThrow(target, nextKey, propValue); | 
|         } | 
|     }); | 
|   | 
|     return target; | 
| }; |