Skip to content
Permalink
Newer
Older
100644 70 lines (56 sloc) 2 KB
Ignoring revisions in .git-blame-ignore-revs.
1
'use strict';
2
3
var GetIntrinsic = require('get-intrinsic');
4
5
var $TypeError = GetIntrinsic('%TypeError%');
6
7
var callBound = require('call-bind/callBound');
8
var forEach = require('../helpers/forEach');
9
var every = require('../helpers/every');
10
var some = require('../helpers/some');
11
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');
12
13
var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
14
15
var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
16
var Get = require('./Get');
17
var IsArray = require('./IsArray');
18
var IsIntegralNumber = require('./IsIntegralNumber');
19
var IsPropertyKey = require('./IsPropertyKey');
20
var SameValue = require('./SameValue');
21
var ToNumber = require('./ToNumber');
22
var ToObject = require('./ToObject');
23
var Type = require('./Type');
24
25
// https://262.ecma-international.org/12.0/#sec-copydataproperties
26
27
module.exports = function CopyDataProperties(target, source, excludedItems) {
28
if (Type(target) !== 'Object') {
29
throw new $TypeError('Assertion failed: "target" must be an Object');
30
}
31
32
if (!IsArray(excludedItems) || !every(excludedItems, IsPropertyKey)) {
33
throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
34
}
35
36
if (typeof source === 'undefined' || source === null) {
37
return target;
38
}
39
40
var from = ToObject(source);
41
42
var keys = OwnPropertyKeys(from);
43
forEach(keys, function (nextKey) {
44
var excluded = some(excludedItems, function (e) {
45
return SameValue(e, nextKey) === true;
46
});
47
/*
48
var excluded = false;
49
50
forEach(excludedItems, function (e) {
51
if (SameValue(e, nextKey) === true) {
52
excluded = true;
53
}
54
});
55
*/
56
57
var enumerable = $isEnumerable(from, nextKey) || (
58
// this is to handle string keys being non-enumerable in older engines
59
typeof source === 'string'
60
&& nextKey >= 0
61
&& IsIntegralNumber(ToNumber(nextKey))
62
);
63
if (excluded === false && enumerable) {
64
var propValue = Get(from, nextKey);
65
CreateDataPropertyOrThrow(target, nextKey, propValue);
66
}
67
});
68
69
return target;
70
};