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.
		
		
		
		
			
				
					69 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					69 lines
				
				2.0 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var GetIntrinsic = require('get-intrinsic');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var $TypeError = GetIntrinsic('%TypeError%');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var callBound = require('call-bind/callBound');
							 | 
						||
| 
								 | 
							
								var forEach = require('../helpers/forEach');
							 | 
						||
| 
								 | 
							
								var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var CreateDataProperty = require('./CreateDataProperty');
							 | 
						||
| 
								 | 
							
								var Get = require('./Get');
							 | 
						||
| 
								 | 
							
								var IsArray = require('./IsArray');
							 | 
						||
| 
								 | 
							
								var IsInteger = require('./IsInteger');
							 | 
						||
| 
								 | 
							
								var IsPropertyKey = require('./IsPropertyKey');
							 | 
						||
| 
								 | 
							
								var SameValue = require('./SameValue');
							 | 
						||
| 
								 | 
							
								var ToNumber = require('./ToNumber');
							 | 
						||
| 
								 | 
							
								var ToObject = require('./ToObject');
							 | 
						||
| 
								 | 
							
								var Type = require('./Type');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// https://262.ecma-international.org/9.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)) {
							 | 
						||
| 
								 | 
							
										throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									for (var i = 0; i < excludedItems.length; i += 1) {
							 | 
						||
| 
								 | 
							
										if (!IsPropertyKey(excludedItems[i])) {
							 | 
						||
| 
								 | 
							
											throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (typeof source === 'undefined' || source === null) {
							 | 
						||
| 
								 | 
							
										return target;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var fromObj = ToObject(source);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var sourceKeys = OwnPropertyKeys(fromObj);
							 | 
						||
| 
								 | 
							
									forEach(sourceKeys, function (nextKey) {
							 | 
						||
| 
								 | 
							
										var excluded = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										forEach(excludedItems, function (e) {
							 | 
						||
| 
								 | 
							
											if (SameValue(e, nextKey) === true) {
							 | 
						||
| 
								 | 
							
												excluded = true;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var enumerable = $isEnumerable(fromObj, nextKey) || (
							 | 
						||
| 
								 | 
							
										// this is to handle string keys being non-enumerable in older engines
							 | 
						||
| 
								 | 
							
											typeof source === 'string'
							 | 
						||
| 
								 | 
							
								            && nextKey >= 0
							 | 
						||
| 
								 | 
							
								            && IsInteger(ToNumber(nextKey))
							 | 
						||
| 
								 | 
							
										);
							 | 
						||
| 
								 | 
							
										if (excluded === false && enumerable) {
							 | 
						||
| 
								 | 
							
											var propValue = Get(fromObj, nextKey);
							 | 
						||
| 
								 | 
							
											CreateDataProperty(target, nextKey, propValue);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return target;
							 | 
						||
| 
								 | 
							
								};
							 |