blob: 9a39c8dd74bde664942c175e7f04033b055ddc1d [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001'use strict';
2
3var CreateDataProperty = require('es-abstract/2020/CreateDataProperty');
4var IsCallable = require('es-abstract/2020/IsCallable');
5var RequireObjectCoercible = require('es-abstract/2020/RequireObjectCoercible');
6var ToObject = require('es-abstract/2020/ToObject');
7var callBound = require('call-bind/callBound');
8
9var $gOPD = Object.getOwnPropertyDescriptor;
10var $getOwnNames = Object.getOwnPropertyNames;
11var $getSymbols = Object.getOwnPropertySymbols;
12var $concat = callBound('Array.prototype.concat');
13var $reduce = callBound('Array.prototype.reduce');
14var getAll = $getSymbols ? function (obj) {
15 return $concat($getOwnNames(obj), $getSymbols(obj));
16} : $getOwnNames;
17
18var isES5 = IsCallable($gOPD) && IsCallable($getOwnNames);
19
20module.exports = function getOwnPropertyDescriptors(value) {
21 RequireObjectCoercible(value);
22 if (!isES5) {
23 throw new TypeError('getOwnPropertyDescriptors requires Object.getOwnPropertyDescriptor');
24 }
25
26 var O = ToObject(value);
27 return $reduce(
28 getAll(O),
29 function (acc, key) {
30 var descriptor = $gOPD(O, key);
31 if (typeof descriptor !== 'undefined') {
32 CreateDataProperty(acc, key, descriptor);
33 }
34 return acc;
35 },
36 {}
37 );
38};