| Leo Repp | 58b9f11 | 2021-11-22 11:57:47 +0100 | [diff] [blame^] | 1 | 'use strict'; |
| 2 | |
| 3 | var CreateDataProperty = require('es-abstract/2020/CreateDataProperty'); |
| 4 | var IsCallable = require('es-abstract/2020/IsCallable'); |
| 5 | var RequireObjectCoercible = require('es-abstract/2020/RequireObjectCoercible'); |
| 6 | var ToObject = require('es-abstract/2020/ToObject'); |
| 7 | var callBound = require('call-bind/callBound'); |
| 8 | |
| 9 | var $gOPD = Object.getOwnPropertyDescriptor; |
| 10 | var $getOwnNames = Object.getOwnPropertyNames; |
| 11 | var $getSymbols = Object.getOwnPropertySymbols; |
| 12 | var $concat = callBound('Array.prototype.concat'); |
| 13 | var $reduce = callBound('Array.prototype.reduce'); |
| 14 | var getAll = $getSymbols ? function (obj) { |
| 15 | return $concat($getOwnNames(obj), $getSymbols(obj)); |
| 16 | } : $getOwnNames; |
| 17 | |
| 18 | var isES5 = IsCallable($gOPD) && IsCallable($getOwnNames); |
| 19 | |
| 20 | module.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 | }; |