1'use strict'; 2 3var ES = require('es-abstract/es7'); 4 5var defineProperty = Object.defineProperty; 6var getDescriptor = Object.getOwnPropertyDescriptor; 7var getOwnNames = Object.getOwnPropertyNames; 8var getSymbols = Object.getOwnPropertySymbols; 9var concat = Function.call.bind(Array.prototype.concat); 10var reduce = Function.call.bind(Array.prototype.reduce); 11var getAll = getSymbols ? function (obj) { 12 return concat(getOwnNames(obj), getSymbols(obj)); 13} : getOwnNames; 14 15var isES5 = ES.IsCallable(getDescriptor) && ES.IsCallable(getOwnNames); 16 17var safePut = function put(obj, prop, val) { // eslint-disable-line max-params 18 if (defineProperty && prop in obj) { 19 defineProperty(obj, prop, { 20 configurable: true, 21 enumerable: true, 22 value: val, 23 writable: true 24 }); 25 } else { 26 obj[prop] = val; 27 } 28}; 29 30module.exports = function getOwnPropertyDescriptors(value) { 31 ES.RequireObjectCoercible(value); 32 if (!isES5) { 33 throw new TypeError('getOwnPropertyDescriptors requires Object.getOwnPropertyDescriptor'); 34 } 35 36 var O = ES.ToObject(value); 37 return reduce(getAll(O), function (acc, key) { 38 var descriptor = getDescriptor(O, key); 39 if (typeof descriptor !== 'undefined') { 40 safePut(acc, key, descriptor); 41 } 42 return acc; 43 }, {}); 44}; 45