| 'use strict'; |
| |
| var ES = require('es-abstract/es7'); |
| |
| var defineProperty = Object.defineProperty; |
| var getDescriptor = Object.getOwnPropertyDescriptor; |
| var getOwnNames = Object.getOwnPropertyNames; |
| var getSymbols = Object.getOwnPropertySymbols; |
| var concat = Function.call.bind(Array.prototype.concat); |
| var reduce = Function.call.bind(Array.prototype.reduce); |
| var getAll = getSymbols ? function (obj) { |
| return concat(getOwnNames(obj), getSymbols(obj)); |
| } : getOwnNames; |
| |
| var isES5 = ES.IsCallable(getDescriptor) && ES.IsCallable(getOwnNames); |
| |
| var safePut = function put(obj, prop, val) { // eslint-disable-line max-params |
| if (defineProperty && prop in obj) { |
| defineProperty(obj, prop, { |
| configurable: true, |
| enumerable: true, |
| value: val, |
| writable: true |
| }); |
| } else { |
| obj[prop] = val; |
| } |
| }; |
| |
| module.exports = function getOwnPropertyDescriptors(value) { |
| ES.RequireObjectCoercible(value); |
| if (!isES5) { |
| throw new TypeError('getOwnPropertyDescriptors requires Object.getOwnPropertyDescriptor'); |
| } |
| |
| var O = ES.ToObject(value); |
| return reduce(getAll(O), function (acc, key) { |
| var descriptor = getDescriptor(O, key); |
| if (typeof descriptor !== 'undefined') { |
| safePut(acc, key, descriptor); |
| } |
| return acc; |
| }, {}); |
| }; |